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}"

并得到它:

在此处输入图像描述

先感谢您..

4

2 回答 2

4

你的binRed, binGreen,binBlue实际上是字符串,因为b*解压成bitstrings。对于字符串,<<意味着追加,所以难怪奇怪的字符(字符代码 2)被打印出来。

我对 ChunkyPNG 不熟悉,但从文档看来currentRed, currentGreen,currentBlue已经是整数。您应该能够直接对它们执行位移。

于 2013-10-08T19:31:37.053 回答
1

在 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

And currentRed, currentBlue, andcurrentGreen已经是类型Fixnum

于 2019-04-20T01:49:25.323 回答