2013-10-08 5 views
0

Как сделать двоичный сдвиг влево в целочисленном значении с помощью Ruby?Рубиновый двоичный сдвиг влево


Я пытаюсь сделать сдвиг влево бинарную операцию, но я получаю странный символ вместо переезда ..

Я думаю, что он должен выполнять, как это: (Java)

b = (b >> 2); // 0011 1111
b = (b < < 2); // 1111 1100

Я делаю это в рубине:

currentRed = ChunkyPNG::Color.r(image[x,y]) 
currentGreen = ChunkyPNG::Color.g(image[x,y]) 
currentBlue = ChunkyPNG::Color.b(image[x,y]) 

binRed = currentRed.to_s.unpack("b*")[0] 
binGreen = currentGreen.to_s.unpack("b*")[0] 
binBlue = currentBlue.to_s.unpack("b*")[0] 

puts "original" 

puts "r #{binRed}" 
puts "g #{binGreen}" 
puts "b #{binBlue}" 

puts "------" 

binRed = binRed << 2 

binGreen = binGreen << 2 
binBlue = binBlue << 2 


puts "new" 

puts "r #{binRed}" 
puts "g #{binGreen}" 
puts "b #{binBlue}" 

и получить его:

enter image description here

спасибо заранее ..

+1

В чем вопрос? – sawa

+0

Как преобразовать значения rgb в двоичную двоичную форму? Я попытался преобразовать значения rgb в двоичную форму следующим образом: binRed = currentRed.to_s (2) \t binGreen = currentGreen.to_s (2) \t binBlue = currentBlue.to_s (2), но я получил тот же результат, что и на печатном экране выше .. потому что они все еще строка .. – Alexandre

ответ

4

Ваш binRed, binGreen , binBlue - это фактически строки, потому что b* распаковать в bitstrings. Для строк, << означает append, поэтому неудивительно, что печатный символ (код символа 2) был напечатан.

Я не знаком с ChunkyPNG, но из doc это выглядит как currentRed, currentGreen, currentBlue уже целые числа. Вы должны иметь возможность выполнять смещение бит непосредственно на них.

+0

Спасибо, Worakam, вы правы .. и да currentRed, currentGreen и currentBlue являются целыми числами, но они являются значениями rgb, мне нужно преобразовать их в двоичные, а затем выполнить бит shift ... do вы знаете, как это сделать? – Alexandre

+0

Вам не нужно преобразовывать их в двоичные (потому что они уже двоичные под капотом). Просто сделайте 'currentRed << 2', и он сдвинет 2 бита влево ... И если вы хотите усечь их до 24 бит, как в оригинале, вы можете замаскировать их с помощью 0xFFFFFF. Так что что-то вроде 'currentRed = (currentRed << 2) & 0xFFFFFF' должно служить вашим потребностям. –

+0

Делая это, я получил: --------- оригинального г 253 г 253 б 253 ------ нового г 1012 г 1012 б 1012 , что это правильно? Мне нужна левая смена, потому что я пытаюсь выполнить последнее значительное изменение бит, чтобы поместить мои данные в png. – Alexandre

Смежные вопросы