这三个运算符,都是用于将十进制数字,转换为二进制并通过二进制移位计算后,再转为十进制返回结果。
既然要转二进制,我们就要学习下怎么将十进制与二进制如何互转了。这里是我另一篇博客
这是用到js的方法,但是有时候我们是在面试的时候遇到这种题,那还是要靠自己手算来获取答案。
二进制转十进制比较简单,就是把二进制数字中不为0的数字的权值相加,下面是一段二进制数字。
1100 // 二进制
// 1、上面,为1的数字,被称为有效数字,为0的是无效数字,当然这只是在我们的算法中这样认为。
// 2、我们要掌握一些权值,有一段数字为11111,5个1分别对应的权值为16 8 4 2 1,
// 可以看出来这是2的平方随着数字的增加而增加,还可以有更多的权值,但我脑子不好,算不了了。
// 3、用上面我们求出的权值来计算我们取出的2进制数字1100,0为无效值,只计算1,两个1对应的权值为4和8,相加即为12。
// 4、上面的一段二进制数字转为10进制,即为12。
接下来是把十进制转换成二进制,利用短除法
12 // 十进制
// 1、12/2 = 6 余 0 不断除2,商为0为止
// 2、6/2 = 3 余 0
// 3、3/2 = 1 余 1
// 4、1/2 = 0 余 1
// 5、取余数为0011,再将余数倒序为1100,这个不就是上面的二进制转10进制给求出来了。
1、<< (有符号运算符)
console.log(5 << 2); // 返回值20
// 移位运算符是将10进制转换成32位的二进制数字,然后对其进行操作的。
// 1、求出5的32位二进制数字,先将5装换成2进制为101,补齐至32位则是在101前面加上29个0,结果为 29个0...101。
// 2、32位数从右往左整体移动两位,移出的去掉,并在数字末尾补零,结果为 27个0...10100。
// 3、接着,我们从右往左看,把最后一位有效数字之后的无效数字全部去掉,结果为 10100,再将2进制转换为10进制即为20。
// 这些都是面试要掌握的,实际应用,还真想不出来
2. >> (有符号运算符)
二进制加法
1+1 = 10 进位1
0+0 = 0
1+0 = 1
---------------------------------
1011
+ 1
————
1110
---------------------------------
// 从右看步骤1、1+1 = 10 进1位 0
// 2、 1+进1 = 10 进1位 1
// 3、 0+进1 = 1 1
// 4、 1不加 1
console.log(-5 >> 2); // 返回值-2
// 负数的算法略微不同
// 1、首先求-5的绝对值,5的32位二进制为0000 0000 0000 0000 0000 0000 0000 0101
// 2、取反+1,为1111 1111 1111 1111 1111 1111 1111 1011
// 3、带符号也就是负数执行移位操作时,移出的去掉,并在数字末尾补1,结果为
// 1111 1111 1111 1111 1111 1111 1111 1110
// 4、再仅把最后一个有效值之前的取反,符号位补1,再将二进制结果加1结果为
// 1000 0000 0000 0000 0000 0000 0000 0010,转换成十进制为-2
console.log(-8 >> 3) // -1
// 1、0000 0000 0000 0000 0000 0000 0000 1000
// 2、1111 1111 1111 1111 1111 1111 1111 1111
// 3、1111 1111 1111 1111 1111 1111 1111 1111
// 4、0000 0000 0000 0000 0000 0000 0000 0001 -1
3. >>> (无符号运算符)
无符号运算符,哪怕被运算的是有符号的数字(负数),也会把负数当做其绝对值计算,所以计算的负数可能会特别大。
正整数
console.log(10 >>> 1) // 5
console.log(10 >> 1) // 5
// 这个正数的计算方法和有符号运算符>>的结果是一样的,区别在于负数
负数
console.log(-10 >>> 1) // 返回值 536870911
// 和第一个有符号运算符的计算方法一致,只不过位移方向不同
// 转换 1、0000 0000 0000 0000 0000 0000 0000 1010
// 负数取反+1位移,在此位移的需补0而不是补1,而后无需取反+1
// 2、0111 1111 1111 1111 1111 1111 1111 1011
// 运算 3、536870911
这里的运算太复杂,不适合我这种简单的脑子,
百度了一个转换工具,点这里
这个没什么用的东西是在写String的方法时看到的,脑子一热就想搞懂它,下次可不能这样了,家中一定常备退烧药。