如何左移整数的位
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何左移整数的位相关的知识,希望对你有一定的参考价值。
我需要在Ruby中按n
左移整数的32位。我正在尝试规范的实现:
class Integer
def rotl32 n
return (self << n) | (self >> (32 - n))
end
end
使用大量数字出问题了:结果溢出32位。我猜是因为Ruby中Integer的理论上无限制的大小而发生的。
如何做到不溢出?
答案
Ruby将自动切换到不同的内部表示形式以容纳更大的数字,因此您需要使用掩码将其设置为上限:
class Integer
def rotl32(n)
mask = (1 << (32 - n)) - 1
((self & mask) << n) | (self >> (32 - n))
end
end
mask
指示哪些位应左移,其余位在移位前有效地修剪掉。
Ruby很乐意做一些非常可笑的事情,例如1 << (1 << 16)
,它产生的数字为19,729位数字。这也是一个整数。
请注意,如果您需要这种方法来提高性能,您希望使用查找表而不是每次都进行计算,尽管像往常一样,我还是以基准测试为基准,以确保该方法更快。
以上是关于如何左移整数的位的主要内容,如果未能解决你的问题,请参考以下文章