无关语言的位运算

最近在刷LeetCode,好多简单级别的题目,自己感觉却很难,尤其涉及到位运算的,其实本身位运算很好理解,知识平时不怎么用,这些知识处于冷冻期,感觉比较陌生

以LeetCode-190 为例,让翻转二进制位,其实有一个笨办法,把二进制转成一个字符串,或者字符数组,然后翻转在拼接,不过这个办法太蠢了,使用位运算来处理,算是一个入门的答案

位运算

位运算都是以二进制作为基本单位进行运算的。以后的例子说的 “位” 也是值二进制的每一位,

  1. 按位与 &

两个相应的位都为1,该位的结果值才为1,否则为0。

1
2
3
4
5
1001
&
1100
------
1000
  1. 按位或 |

两个相应的位中只要有一个为1,该位的结果值就为1

1
2
3
4
5
1001 
|
1100
------
1101
  1. 按位异或 ^
    两个相应的位不同则该位为1,否则该位为0
1
2
3
4
5
1001 
|
1100
------
0101
  1. 按位取反 ~

每一位执行逻辑反操作。使数字1成为0,0成为1。

1
2
3
~ 1001  
------
0110
  1. 向左位移 <<

x << y 将 x 的每一位向左移动 y 位,移位后空缺的部分全部填0。也就是右边加 y 个0

1
2
3
4
5
6
7
1010   
<<
3
-------
1010000
// 用 10进制表示的话就是
// 10 << 3 = 80
  1. 向右位移 >>

原理和左位移一样,只是方向换了,x >> y 将 x 的每一位向右移动 y 位,移位后左边补0。右边超出的的就被丢弃了。

1
2
3
4
5
6
7
8
1010   
>>
3
-------
0001
// 010 被丢弃了,左边补充了3个0
// 用 10进制表示的话就是
// 10 >> 3 = 1

上面所用的运算符是以 JS 为例,而且大部分语言都差不多,不过个别语言也有一些差异。例如在golang中,取反用的 是^, ^8 表示对 8 取反。

  1. 清位 &^

这个是 JS中没有, 这是 golang 中的一个运算符,例如: x &^ y 表示对 y 取反之后,在用 x & y,用js表示的话,其实相当于x & (~y)

1
2
3
4
5
6
1010
&^
1001
----
0010

其他

位运算不止这些,在一些运算中,还涉及到进制转换、反吗、补码等相关知识

作者

Fat Dong

发布于

2022-07-13

更新于

2022-10-08

许可协议