cube 发表于 2019-7-9 21:54

javascript 位移问题 >>32 >>>32

本帖最后由 cube 于 2019-7-12 21:06 编辑

a = -1
a>>32结果为-1
a>>>32结果为0x0ffffffff并不是-1 我理解为仅仅是符号位置0了.


1<<32
1>>32
1>>>32
的结果都是1
参考链接中,"右操作数应小于 32位,否则只有最低 5 个字节会被使用", 这里究竟是小于32位还是小于32呢.以及低5字节被使用是指左操作数?当然,如果32是指32位,那么5字节应该是指右操作数了.
这是何解呢?
参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Unsigned_right_shift

saidom1949 发表于 2019-7-9 22:31

这帖子不是解释了吗
向右移动,左侧按照右侧填充,就变成:
111111111111111……111--》11111111111……111   结果还是-1
无符号移动自动补零
就变成了0000000000000000……001
结果你是x64系统 结果后面还有32个1就变成 000000000……0001111111111……1就是那啥数了

cube 发表于 2019-7-9 22:51

本帖最后由 cube 于 2019-7-9 22:56 编辑

saidom1949 发表于 2019-7-9 22:31
这帖子不是解释了吗
向右移动,左侧按照右侧填充,就变成:
111111111111111……111--》11111111111……1 ...
如果是这样解释,那么
1>>>32
1>>32
1<<32
结果都是1,又是何解呢?

孤狼微博 发表于 2019-7-9 22:53

就是-1没有问题的

安兆童 发表于 2019-7-9 23:38

谢谢分享一下!

saidom1949 发表于 2019-7-10 16:32

本帖最后由 saidom1949 于 2019-7-10 17:01 编辑

cube 发表于 2019-7-9 22:51
如果是这样解释,那么
1>>>32
1>>32

嗯 我刚刚查了一下,我解释错误了
原因是:当你位移32位时(无论左右),自动归0,也就是等于你位移0位(我估摸应该是溢出了),所以位移32位等于没位移;
同理,你位移32的倍数时,还是等于位移0位。
而负数因为有一个高位不计入位移部分,然后同上计算,无论你怎么位移32的倍数位数,都等于-1。
之前解释错误,实在抱歉。

cube 发表于 2019-7-10 23:05

本帖最后由 cube 于 2019-7-10 23:11 编辑

saidom1949 发表于 2019-7-10 16:32
嗯 我刚刚查了一下,我解释错误了
原因是:当你位移32位时(无论左右),自动归0,也就是等于你位移0位( ...
嗯,谢谢,你回答了三次,我都看了. 你说的对.

js中的位移操作,首先会把左右操作数转为32位,然后位移
而位移n位,就如你所说,实际位移了n%32位(测试后的猜测,并没找到文档支持)

引申出以下疑问:
a = -1 = 0xff...f我不知道a是多少位,但符号位一定是1
a>>>32
首先会把a转为32位 即:0xffff,ffff ,然后右移32%32位, 但是结果却是 ‭4294967295 ‬ 说明符号位变0了.结果的宽度变的超过32位了. 很奇怪.

cube 发表于 2019-7-10 23:17

本帖最后由 cube 于 2019-7-10 23:19 编辑

a = -1 = 0xff...f我不知道a是多少位,但符号位一定是1
a>>>32
首先会把a转为32位 即:0xffff,ffff ,然后右移32%32位, 但是结果却是 4294967295说明符号位变0了.结果的宽度变的超过32位了. 很奇怪
嗯,是了.返回结果与左操作数同类型,这样就可以解释了.
a = -1 = 0xff...f
a>>>32 = 0xffff,ffff再扩充到a的同类型(高位补0),也就变成了正数
所以
a>>>32 = 0xffff,ffff=0x00...0ffff,ffff = 4294967295

xuhh 发表于 2019-7-11 09:31

你使用位移运算符,你的符号位会变吗?

cube 发表于 2019-7-11 20:17

xuhh 发表于 2019-7-11 09:31
你使用位移运算符,你的符号位会变吗?

不是我的.这是javascript .
另:你也可以试试.
页: [1]
查看完整版本: javascript 位移问题 >>32 >>>32