理解javascript的位运算

位运算是二级制数据之间的运算,由于位运算是非常底层的操作,所以执行起来非常快。适当地使用位运算可以将你的代码运行速度有进一步提升!

关于不同进制之间如何互相转换我推荐这位up主的视频

js中的逻辑运算符,以及手算公式
&逻辑与/
|逻辑或/
~逻辑非/
^逻辑异或/
<<左位移(空位0填充)a<<b === a*b**2
>>>右位移(空位0填充)/
>>

右位移(空位看情况填充)

a>>b === Math.floor(a/(2**b))

目录

1. 逻辑与 &

 2. 逻辑或  |

 3. 逻辑非 ~

 4. 逻辑异或 ^

 5. 数据左移(空位补0)  <<

 6. 数据右移(空位补0)   >>>

7. 数据右移 (空位看情况填充)  >>


1. 逻辑与 &

当此运算符左右皆是1的时候,返回结果1,其他情况返回0;例:
原式:14 & 22
转二进:1110 & 10110
在Javascript中每个数字都是int类型,也就是占32个二进制单元:

00000000 00000000 00000000 00001110
00000000 00000000 00000000 00010110
-----------------------------------
00000000 00000000 00000000 00000110

所以结果就是110,
110转十进制就是6

nodejs测试运算结果14 & 22 ==6

 2. 逻辑或  |

当此运算符左右有任何一个是1,运算结果就是1
还是拿14 和 22举例
原式:14 | 22
转二进:1110 |  10110

00000000 00000000 00000000 00001110
00000000 00000000 00000000 00010110
-----------------------------------
00000000 00000000 00000000 00011110

所以运算结果是11110,
转回十进制是30

nodejs测试运算结果14 | 22 ==30

 3. 逻辑非 ~

这个运算符是一种取反的运算符,1变成0,0变成1,只有一个数字参与运算。
例如:逻辑非 52
~ 52

~52
二进制:~110100
放进int类型的数据单元中
00000000 00000000 00000000 00110100
取反:
11111111 11111111 11111111 11001011

11111111 11111111 11111111 11001011
转换成十进制就是负53
相同地,把负53再次取反就变回52了

nodejs测试运算结果~52 = -53 , ~-53 = 52
        

 4. 逻辑异或 ^

当运算符左右不相同时返回1,其他情况返回0
举例: 985 ^ 211

985 ^ 211
985转二进:1111011001
211转二进:11010011
放进int类型的数据单元中
00000000 00000000 00000011 11011001
00000000 00000000 00000000 11010011
-----------------------------------
00000000 00000000 00000011 00001010

 把1100001010转换成十进制:778

nodejs测试运算结果985 ^ 211 == 778

 5. 数据左移(空位补0)  <<

和前面四个运算符不同,这个运算符直接往左或往右移动二进制数据
当数据左移过多导致超出此数据单元时,舍弃超出的那部分数据
手算公式a<<b === a*b**2
例子:将985左移三位

985 << 3
985转二进:1111011001
/
00000000 00000000 00000011 11011001
                      ↙↙↙↙↙↙↙ 最后的空位用0填充
00000000 00000000 00011110 11001000
/
1111011001000转十进制是7880

例子2: 将15 左移2位

15 << 2
先把15转换成二进制
00000000 00000000 00000000 00001111
左移2位后
00000000 00000000 00000000 00111100
//
111100转换成十进制:60

nodejs测试运算结果985 << 3 ==7880和15 << 2 == 60

 6. 数据右移(空位补0)   >>>

和数据左移操作符的执行逻辑差不多,只是方向变了

15 >>> 1
先把15转换成二进制
00000000 00000000 00000000 00001111
右移一位后
00000000 00000000 00000000 00000111
                               超出数据存储单元的1舍弃
//
111转十进制 7
-3 >>> 2
转二进制 :
11111111 11111111 11111111 11111101
右移2位
00111111 11111111 11111111 11111111
空位补0                       超出舍弃

7. 数据右移 (空位看情况填充)  >>

怎么个看情况填充法?很简单,原数据的首位是1,就填充1,原数据的首位是0就填充0
手算公式:

a>>b === Math.floor(a/(2**b))

例如一段二进制数据长这样:
00001100 11001111 11010111 11110000
右移2位:
00000011 00110011 11110101 11111100
/
例如又有一段二进制数据长这样:
11111010 11111000 11111111 11111111
右移2位:
11111110 10111110 00111111 11111111

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值