`>>`(有符号右移) 和 `>>>`(无符号右移)区别

您所在的位置:网站首页 python位操作无符号右移 `>>`(有符号右移) 和 `>>>`(无符号右移)区别

`>>`(有符号右移) 和 `>>>`(无符号右移)区别

2023-03-22 18:18| 来源: 网络整理| 查看: 265

这翻译我真的不想说啥。直接看MDN英文吧:

>> (有符号右移)

sign-propagating(符号位-传播)右移 我们知道,计算机中以二进制存储数字,二进制中最左边的第一位,叫符号位,所以这就很明显了,右移2位后,最左边缺少2位数字,那就应该填充数字,那填充什么呢?符号位是什么,我就填什么,所以 -9 >> 2 中最左边2位和符号位一样,都是1。

>>> (无符号右移)

zero-fill(零-填充) 这个就更明显了,直接就说了,用0填充,所以右移后空位不管你符号位是啥,我都只填0。

总结

因此所说的 有符号、无符号 看的就是二进制的符号位, 无符号:就不管符号位,右移只填充0;有符号,就是符号位是啥,我就填充啥,Java中也是同理。

背景

作为一只前端,看这破位运算干啥?因为最近看到一篇二分文章,很有意思。用文章中的说法,去做 LeetCode 69 用位运算求mid会有个坑:

题目:

用无符号右移可以通过

var mySqrt = function(x) { let left = 0, right = x; while (left < right) { const mid = left + right + 1 >>> 1; if (mid * mid > x) { right = mid - 1; } else { left = mid; } } return left; }; 复制代码

但有符号右移就不行,你可以试一下

原因是会卡在 2147483647 这个case,你想知道为什么吗?(有趣的事情开始了)

我们可以发现 2147483647 的二进制是 1111111111111111111111111111111(共31个1)这里,我还有left + right + 1的操作,即 0 + 2147483647 + 1 那这个值二进制便是 10000000000000000000000000000000 (共32位)

学过C++的同学就会发现一些问题了, C++中 int 是32位,最左边一位是符号位,所以你这溢出了呀,之后你又是 >> 操作,所以右移后会变成 11000000000000000000000000000000(共32位)

但这又和我JS有啥关系呢?你个C++跟我扯啥呢?我JS个个数都是64位双精度浮点数,表示的值大了去了呢!

但是还真有关系,因为JS做位运算时,会先转为32位整数,再做位运算。所以应了那句话:JS做位运算,不快。

所以当到 0 + 2147483647 + 1 时,计算就已经错误了,这时是一个负数了。那你说是负数我就信啊?你坏的很,我信你个鬼!

但是,你自己验证一下,不想相信都不行呀。

欢迎关注公众号「一只前端」

我会定时分享一些所学与总结,与大家共同进步



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3