我有一个整数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)
)并遍历字符串,但我觉得必须有更清洁,更直接的方式。
答案 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