JavaScript 请教一下为何 JavaScript 里 right shift 所得有时会与 Ruby 里不同

muzik · 2016年01月01日 · 最后由 muzik 回复于 2016年01月02日 · 1788 次阅读

一个例子:

#ruby
3500935230448 >> 28
#=13042
#等同于
3500935230448.to_s(2)[0,42-28].to_i(2)
#=13042
//javascript
3500935230448 >> 28
//=2

请问,在 javascript 这个 2 是怎么算出来的?

1 楼 已删除

算法小白解答

js 是 32 位

3500935230448 >> 28
//等同于
(3500935230448 & 2147483647 + 2147483648) >> 28

别问我怎么知道的 http://translate.google.cn/translate/releases/twsfe_w_20151214_RC03/r/js/desktop_module_main.js 里发现的

#2 楼 @nine 不好意思,可否再请教下。因为我还是不知其所以然,所以又被这个例子难住了 😭

#ruby
252644352 << 4
 #=> 4042309632
//javascript
252644352 << 4
//=-252657664

#4 楼 @muzik 32 位最大值 2147483647 小于这个值的直接 >> ,大于的才用那个

#4 楼 @muzik

可能用 16 进制来看更加清楚一点

252644352 这个数用十六进制表示是 0x0F0F0C00,左移四位,变成 0xF0F0C000 正好 32 位。对 javascript 来说,并没有溢出。

如果表示无符号数,就是 4042309632。表示有符号数,就要算补码,除最高位取反加 1 后就是 0x0F0F4000,加上负号就是 -252657664。

之所以 javascript 认为 252644352 是个有符号数,是因为在进行位操作时,js 默认会将这个对象转换成有符号数(不是很明白为什么要这样转化^0^)。

谢谢两位耐心解答。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号