1. 为什么要学位运算
因为这是计算机内部运算的语言,所以会非常快。
本人是因为学习算法经常遇见一些求二进制中的0和1的各种操作,好多都不知道所以特此整理一下,如有不对,烦请指正。
2. 什么是位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
(来源百度百科)
3. 位运算符与操作
3.1 按位与(&)
//将数字化为二进制然后进行按位与
//1 & 0 0
//1 & 1 1
//0 & 1 0
//0 & 0 0
3 & 4
011
100
--------
000
3.2 按位或 (|)
//将数字化为二进制然后进行按位或
//1 | 0 1
//1 | 1 1
//0 | 1 1
//0 | 0 0
3 | 4
011
100
--------
111
3.3 异或运算(^)
//将数字化为二进制然后进行按位异或相同为0,不同为1
//1 ^ 0 1
//1 ^ 1 0
//0 ^ 1 1
//0 ^ 0 0
3 ^ 4
101
100
--------
001
异或运算是我最近做算法题遇到的,题意大概就是二进制表示形式只有一位不同。
这个时候就可以使用异或操作,然后计算异或完后1的个数就可以知道他是不是一位不同。
leetcode 1238
leetcode 89
3.4 取反运算(~)
将该数的二进制形式取反,如
4
100
~ 4
011
3.5 左移操作 (<<)
相等于对原数乘了2 的n次方
<< 前面代表要移的数
<< 后面代表要移几位
4
100
4 << 1
1000
8
4 << 2
10000
4 * 2 ^ n
16
3.6 右移操作(>>)
相等于对原数除了2 的n次方取整
>> 前面代表要移的数
>> 后面代表要移几位
4
100
4 >> 1
010
2
4 >> 2
001
4 / 2 ^ n
1
以上有遇到算法题的我会进行标注,持续更新