【问题标题】:Getting the same result from Ruby as Javascript for bitwise XOR从 Ruby 获得与 Javascript 相同的结果以进行按位异或
【发布时间】:2013-06-12 01:16:43
【问题描述】:

在 Ruby 中:

-1104507 ^ 3965973030 => -3966969949

在 Javascript 中:

-1104507 ^ 3965973030 => 327997347

有人问了similar question here,但答案只是指向了 Closure 的包装器。我需要一种从 Ruby 获得与 JavaScript 相同的答案的方法,以便我可以移植这段代码。

我需要一种能够从 Ruby 中的任何 A ^ B 获取任何整数 AB 的 JavaScript 结果的方法。

【问题讨论】:

标签: javascript cryptography web-scraping crc32


【解决方案1】:

这两个相同的结果,模232。在 Ruby 中,您可以 & 4294967295 使结果与 Javascript 中相同。

为了涵盖所有情况,您需要考虑到 Javascript 将二进制值视为 有符号 32 位整数。另一方面,Ruby 将通过& 4294967295 操作生成无符号 32 位整数。

所以,在 Javascript 中:

c = a ^ b

要在 Ruby 中获得同样的效果:

c = (a ^ b) & 4294967295
c -= 4294967296 if c > 2147483647

【讨论】:

  • 332763 ^ 2714866558 怎么样。这个在 ruby​​ 中给出 2715058341,在 JS 中给出 -1579908955。如果你这样做 2715058341 & 4294967295 它仍然是 4294967295
  • 你的意思是它仍然是 2715058341。看我的回答。
【解决方案2】:

感谢 Mark Adler 的最初提示,我认为这是通过算法实现的方法:

max_32_int = (2**32)

c = a ^ b

if c > (max_32_int/2)
  c = c - max_32_int
elsif c < -(max_32_int/2)
  c = c + max_32_int
end

【讨论】:

  • 您只需要一个if。看我的回答。
  • 好吧,你的有&amp;-。我的使用+-。相同数量的运营商,不是吗?
  • if 语句会减慢速度,因为它们会干扰前瞻执行单元。即使你有更多的运营商,但更少的if's,那将是一个胜利。所以少一个if 和同样数量的运营商绝对是一场胜利。我应该看看我是否可以用更多的运营商摆脱剩余的if
  • 这并不重要,因为 ruby​​ 是一个解释器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多