Ruby中的位移

时间:2012-02-25 16:26:53

标签: ruby vb.net bit-shift

我正在将Visual Basic应用程序转换为Ruby,因为我们正在将它转移到Web上。但是,当转换某些算法时,我遇到了有关位移的问题。

我是如何理解的,问题在于大小掩码VB对整数类型的强制执行(如Here所述)。实际上,Ruby并没有区分这些类型。

所以问题是:

Visual Basic

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

红宝石

puts 182 << 24 # 3053453312

我一直在谷歌搜索并阅读过去几个小时的位移,但没有找到解决这个问题的方法或方向。

1 个答案:

答案 0 :(得分:8)

你需要复制visual basic正在做的事情,即

  • 掩盖了记录的移位值
  • 用0xFFFFFFFF掩盖结果(因为ruby会将值提升为bignum为你
  • 如果设置了最高位,则从结果中减去2 ^ 32(因为有符号整数与2s complement一起存储

例如

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