【问题标题】:Rotate Bits Right operation in RubyRuby 中的右移位操作
【发布时间】:2015-09-25 13:42:46
【问题描述】:

Ruby 中有 Rotate Bits Right 吗?

或者请问我该怎么做。

谢谢

【问题讨论】:

  • 您必须提供更多细节。
  • 一个函数:ror(0x08048586,1) => 0x86080485
  • 我不得不说这仍然非常不清楚 - 与其假设每个人都知道你想要实现的目标,不如提供一些背景信息并解释你是如何/做什么/为什么以及你试图做什么到目前为止。
  • 哦...ROR = 向右旋转不是 Ruby on Rails。如果您将“ROR”更改为“Rotate Bits Right”,那么您会得到更好的响应;)
  • 这更有意义 - 我将其作为 Ruby on Rails 阅读

标签: ruby bitwise-operators


【解决方案1】:

一些事实:

  • 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

【讨论】:

  • 0xFFFFFFFF 对于 32 位可以替换为 ('1'*32).to_i(2),因此不再是硬编码。
  • ('1'*32).to_i(2) 不是一个好主意。它确实投射,一个缓慢的操作。最好使用 2**32-1 之类的东西
【解决方案2】:

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

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

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

【讨论】:

  • 这个 gem 没有安装在 windows 上(或者来自 Mac 上的问题)。虽然它看起来有一个不错的界面,但我目前无法使用它
  • @LukeChadwick 让我看看能否在 Windows 上修复它。
  • @LukeChadwick,我刚刚发布了一个可以在 OS X 上运行的新版本。你能检查一下它现在是否可以安装在 Windows 上吗?
【解决方案3】:

ROR 向右旋转。

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

Ruby 确实有

  • 按位右移

运营商

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多