如何左移整数的位

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

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

以上是关于如何左移整数的位的主要内容,如果未能解决你的问题,请参考以下文章

11 二进制中1的个数+二进制补充知识点

HashMap中的位运算

Java 位运算符

如何在 C 中打印 __m128i 变量的位?

C语言如何输入一个整数,将整数整体左移1位,且第一位移动到最后一位,输出.如输入“1234”,输出“2341”?

Java的位运算符详解实例