Ruby二进制左移

时间:2013-10-08 19:03:32

标签: ruby binary bit-manipulation lsb

如何使用Ruby在整数值中进行二进制左移?


我正在尝试左移二进制操作,但我得到一个奇怪的字符 而不是移动..

我认为它应该像这样执行:(java)

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

我在ruby中这样做:

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

提前谢谢你..

2 个答案:

答案 0 :(得分:4)

您的binRedbinGreenbinBlue实际上是字符串,因为b*会解压缩到位字符串。对于字符串,<<表示附加,所以难怪奇怪的字符(字符代码2)被打印出来。

我不熟悉ChunkyPNG,但从doc看起来currentRedcurrentGreencurrentBlue已经是整数。您应该能够直接对它们执行位移。

答案 1 :(得分:0)

在Ruby中,<<是一种方法。实际上,Ruby中的大多数运算符都是方法:

a = b << c
a = b + c
a = b ** c

# This is exactly the same as

a = b.<<(c)
a = b.+(c)
a = b.**(c)

您甚至可以在自己的类中覆盖它们,以使它们执行您想要它们执行的任何操作。就像在Ruby中一样,一切(实际上是一切)都是底层的对象(即使类和模块都是对象,甚至nil都是对象)。

例如对于String而言,<<方法意味着添加。

a = "Hello, " << "Word"
# a == "Hello, Word"

但是对于Fixnum而言,<<方法仅意味着向左移动:

a = 5 << 2
# a == 20

因此,您使用的是正确的“运算符”,但需要确保您的对象属于正确的类。您需要在Ruby中类型为Fixnum的整数。

并且currentRedcurrentBluecurrentGreen的类型已经是Fixnum