如何左移整数的位

问题描述 投票:1回答:1

我需要在Ruby中按n左移整数的32位。我正在尝试规范的实现:

class Integer
    def rotl32 n
        return (self << n) | (self >> (32 - n))
    end
end

使用大量数字出问题了:结果溢出32位。我猜是因为Ruby中Integer的理论上无限制的大小而发生的。

如何做到不溢出?

ruby binary bit-manipulation bitwise-operators integer-overflow
1个回答
4
投票

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位数字。这也是一个整数。

请注意,如果您需要这种方法来提高性能,您希望使用查找表而不是每次都进行计算,尽管像往常一样,我还是以基准测试为基准,以确保该方法更快。

© www.soinside.com 2019 - 2024. All rights reserved.