js 移位运算符《《、》》和》》》

这三个运算符,都是用于将十进制数字,转换为二进制并通过二进制移位计算后,再转为十进制返回结果。

既然要转二进制,我们就要学习下怎么将十进制与二进制如何互转了。这里是我另一篇博客

这是用到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的方法时看到的,脑子一热就想搞懂它,下次可不能这样了,家中一定常备退烧药。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值