Операция Rotate Bits Right в Ruby - PullRequest
       21

Операция Rotate Bits Right в Ruby

5 голосов
/ 13 августа 2010

Есть ли в Ruby права на вращение битов?

Или как мне это сделать, пожалуйста.

Спасибо

Ответы [ 3 ]

15 голосов
/ 13 августа 2010

Некоторые факты:

  • В Ruby есть операторы << и >> для сдвига, но нет встроенного оператора поворота. Вы должны подделать это.
  • Класс Ruby Fixnum автоматически повышается до Bignum, когда значение превышает размер машинного слова. Это включает в себя числа, которые бы помещались в слова без знака, но не в слова со знаком - например, 0xffffffff является положительным Bignum, а не отрицательным Fixnum.

Итак, если вы хотите выполнить операцию поворота, вы: а) должны написать ее, используя операторы сдвига, б) либо жестко кодировать 32 или 64 бита, либо задать Fixnum размер слова, и в) принять, что результат может закончиться до Bignum.

Как говорится, это может сработать:

class Integer
  def ror count
    (self >> count) | (self << (32 - count)) & 0xFFFFFFFF
  end
end
>> printf "0x%x\n", (0x01234567.ror 4)
0x70123456
1 голос
/ 25 сентября 2015

Если вам нужна более высокая производительность и вы не возражаете против добавления зависимости, существует гем bit-twiddle, который обеспечивает эту операцию, реализованную в собственном коде:

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

Раскрытие: я автор этого драгоценного камня.

0 голосов
/ 13 августа 2010

ROR вращается вправо.

Вот реализация C , которую можно перенести на Ruby.

Ruby имеет

  • << Битовый сдвиг влево и </li>
  • битовое смещение вправо

операторы

...