Некоторые факты:
- В 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