Сдвиг битов в Ruby - PullRequest
       1

Сдвиг битов в Ruby

6 голосов
/ 25 февраля 2012

В настоящее время я конвертирую приложение Visual Basic в Ruby, потому что мы переносим его в Интернет. Однако при преобразовании некоторых алгоритмов я столкнулся с проблемой сдвига битов.

Насколько я понимаю, проблема заключается в маске размера, которую VB применяет к целочисленным типам (как объяснено Здесь ). На практике Ruby не различает эти типы.

Итак, проблема:

Visual Basic

Dim i As Integer = 182
WriteLine(i << 24) '-1241513984

рубин

puts 182 << 24 # 3053453312

Я гуглил и читал о сдвиге битов в последние часы, но не нашел пути или даже направления для решения этой проблемы.

1 Ответ

8 голосов
/ 25 февраля 2012

Вам нужно повторить то, что делает Visual Basic, а именно:

  • маскировать значение сдвига, как задокументировано.
  • cap маскировать результат с 0xFFFFFFFF (поскольку ruby ​​будет повышать значение доbignum для вас
  • , если задан самый старший бит, вычтите 2 ^ 32 из результата (поскольку целые числа со знаком хранятся с дополнением 2s

Дляпример

def shift_32 x, shift_amount
  shift_amount &= 0x1F
  x <<= shift_amount
  x &= 0xFFFFFFFF 

  if (x & (1<<31)).zero?
   x
  else
   x - 2**32
  end
end
...