一些位运算

一些位运算

位运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
与运算
&: 0&0=0, 0&1=0, 1&0=0, 1&1=1
0011
& 0101
= 0001

或运算
|: 0|0=0, 0|1=1, 1|0=1, 1|1=1
0011
| 0101
= 0111

异或运算
^: 0^0=0, 0^1=1, 1^0=1, 1^1=0
0011
^ 0101
= 0110

左移运算,低位补0
0110 << 2 = 1000
等同于乘以2的2次方

右移运算,自然数高位补0,负数高位补1
0110 >> 2 = 0001
1001 >> 2 = 1110

无符号右移运算,高位补0
0110 >> 2 = 0001
等同于除以2的2次方

取反运算
~ 0110 = 1001

修改位

1
2
3
4
5
6
7
8
9
下标 3210
0111
& 1101 (1<<3-1<<1)
= 0101

下标 3210
1000
| 0010 (1<<1)
= 1010
1
2
3
4
5
6
public int set0(int n, int i) {
return (n & (i<<32 - 1 << i));
}
public int set1(int n, int i) {
return (n | (1 << i));
}

获取位情况

1
2
3
4
5
6
7
8
下标 3210
1010
& 1000 (1<<3)
= 1000=(1<<3)>0

0101
& 1000 (1<<3)
= 0000=0
1
2
3
public int getb(int n, int i) {
return (n & (1 << i)) > 0 ? 1 : 0;
}

一些位运算
https://cellargalaxy.github.io/posts/算法/7.一些位运算/
作者
cellargalaxy
发布于
2020年5月12日
许可协议