一个例子:
#ruby 3500935230448 >> 28 #=13042 #等同于 3500935230448.to_s(2)[0,42-28].to_i(2) #=13042
//javascript 3500935230448 >> 28 //=2
请问,在 javascript 这个 2 是怎么算出来的?
算法小白解答
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 谢谢
#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^)。
谢谢两位耐心解答。