Ruby中的位移

Nov*_*vae 6 ruby vb.net bit-shift

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

我该如何理解它,问题就出在规模面具VB的整数类型强制执行(如解释在这里).实际上,Ruby并没有区分这些类型.

所以问题是:

Visual Basic

Dim i As Integer = 182
WriteLine(i << 24) '-1241513984
Run Code Online (Sandbox Code Playgroud)

红宝石

puts 182 << 24 # 3053453312
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*ung 8

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

  • 按照记录掩盖移位值
  • 用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
Run Code Online (Sandbox Code Playgroud)