Ruby:如何确定整数高位的值?

时间:2014-07-16 19:50:06

标签: ruby binary bit-shift

我有一个整数common_bits,我正在尝试确定高阶(最左边)位的值。如果该位是1,我想向左移1位(common_bits = common_bits << 1)并递增计数器bitlength

我尝试在AND语句中common_bits使用while掩码,以便如果高阶位为1 common_bits,则会向左移位。但是,它并不起作用,在common_bits终止后,我在while中的高位1位结束。

CHECK_MASK = 0b10000000000000000000000000000000

bitlength = 0
p "Starting common_bits is #{common_bits.to_s(2)}"

while ((common_bits & CHECK_MASK) == CHECK_MASK)
  common_bits = (common_bits << 1) & 0xffffffff 
  bitlength = bitlength + 1
  p "bitlength is #{bitlength}. common_bits is #{common_bits.to_s(2)}"
end

p "Final common_bits is #{common_bits.to_s(2)}"
p "Final bitlength is #{bitlength}"

我考虑过将整数转换为二进制字符串(common_bits.to_s(2))并遍历字符串,但我觉得必须有更清洁,更直接的方式。

1 个答案:

答案 0 :(得分:2)

Ruby不会为你或任何特定的位长度将整数截断为32位。如果有必要,它会将内部表示“升级”到Bignum类并继续运行。 32位不是限制,也不是64,也不是1024。 。

所以如果你需要一个整数保持在一个范围内的整数,例如32位无符号,你必须在任何可能溢出的操作之后自己完成:

CHECK_MASK = 0b10000000000000000000000000000000

while ((common_bits & CHECK_MASK) == CHECK_MASK)
      common_bits = (common_bits << 1) & 0xffffffff
end