旋转位在Ruby中的右操作

时间:2010-08-13 12:52:16

标签: ruby bitwise-operators

Ruby中是否有旋转位?

或者我该怎么办呢。

由于

3 个答案:

答案 0 :(得分:15)

一些事实:

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

因此,如果你想要一个旋转操作,你a)必须使用移位运算符来编写它,b)硬编码32或64位或者询问Fixnum字大小,c)接受结果可能最终成为Bignum

话虽如此,这可能有用:

class Integer
  def ror count
    (self >> count) | (self << (32 - count)) & 0xFFFFFFFF
  end
end
>> printf "0x%x\n", (0x01234567.ror 4)
0x70123456

答案 1 :(得分:1)

如果您需要更高的性能,并且不介意添加依赖项,则有bit-twiddle gem,它提供以本机代码实现的此操作:

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

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

答案 2 :(得分:0)

ROR向右旋转。

这是一个可以移植到Ruby的C implementation

Ruby确实有

  • &LT;&LT;按位左移和
  •   
        

    按位右移

      

运营商