【问题标题】:How to left rotate bits of an Integer如何左旋转整数的位
【发布时间】:2020-05-27 09:19:02
【问题描述】:

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

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

使用大数时出现问题:结果溢出 32 位。我猜这是因为 Ruby 中整数的理论上无限大小。

如何做到不溢出?

【问题讨论】:

  • 无需在标题中添加“Ruby ::”;这就是标签的用途。
  • 您可以用粗体或斜体显示内容,但只有在真正需要时才这样做。强调用于引起对某事的额外注意。如果几乎所有事情都需要额外的关注,那么没有什么会得到额外的关注。 “How do I format my posts...”会有所帮助。

标签: ruby binary bit-manipulation bitwise-operators integer-overflow


【解决方案1】:

Ruby 会自动切换到不同的内部表示以容纳更大的数字,因此您需要使用掩码对其进行限制:

class Integer
  def rotl32(n)
    mask = (1 << (32 - n)) - 1

    ((self & mask) << n) | (self >> (32 - n))
  end
end

mask 表示哪些位应左移,其余位在移位前有效修剪掉。

Ruby 很乐意做一些非常荒谬的事情,比如1 &lt;&lt; (1 &lt;&lt; 16),它会产生一个 19,729 位的数字。这也是一个整数。

请注意,如果您需要此方法的性能更高,您可能希望使用查找表而不是每次都进行计算,但我会一如既往地进行基准测试以确保该方法更快。

【讨论】:

    猜你喜欢
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多