5

Ruby 中有 Rotate Bits 吗?

或者我该怎么做。

谢谢

4

3 回答 3

15

一些事实:

  • Ruby 有运算符<<>>转移,但没有内置的旋转运算符。你必须伪造它。
  • 当值超过机器字长时,Ruby 的Fixnum类会自动提升为。Bignum这包括适合无符号字但不适合有符号字的数字 - 例如,0xffffffff是正数Bignum,而不是负数Fixnum

因此,如果您想要一个旋转操作,您 a) 必须使用移位运算符编写它,b) 硬编码 32 位或 64 位或询问Fixnum字长,并且 c) 接受结果可能最终是 a Bignum.

话虽如此,这可能有效:

class Integer
  def ror count
    (self >> count) | (self << (32 - count)) & 0xFFFFFFFF
  end
end
>> printf "0x%x\n", (0x01234567.ror 4)
0x70123456
于 2010-08-13T13:10:35.160 回答
1

如果您需要更高的性能,并且不介意添加依赖项,那么可以使用bit-twiddlegem,它提供了在本机代码中实现的此操作:

require 'bit-twiddle/core_ext'
# rotate by 8 bits
0x08048586.rrot32(8).to_s(16) # => "86080485"

披露:我是这颗宝石的作者。

于 2015-09-25T05:42:46.623 回答
-1

ROR 是向右旋转。

这是一个可以移植到 Ruby的C 实现。

Ruby 确实有

  • << 位左移和
  • 按位右移

运营商

于 2010-08-13T13:07:18.633 回答