如何使用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}"
得到它:
提前谢谢你..
答案 0 :(得分:4)
您的binRed
,binGreen
,binBlue
实际上是字符串,因为b*
会解压缩到位字符串。对于字符串,<<
表示附加,所以难怪奇怪的字符(字符代码2)被打印出来。
我不熟悉ChunkyPNG,但从doc看起来currentRed
,currentGreen
,currentBlue
已经是整数。您应该能够直接对它们执行位移。
答案 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
的整数。
并且currentRed
,currentBlue
和currentGreen
的类型已经是Fixnum
。