Skip to content

Commit a5697cd

Browse files
committed
auto commmit
1 parent aaca65a commit a5697cd

File tree

2 files changed

+144
-26
lines changed

2 files changed

+144
-26
lines changed

docs/notes/Leetcode 题解 - 位运算.md

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<!-- GFM-TOC -->
2+
* [0. 原理](#0-原理)
23
* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
34
* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
45
* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
@@ -15,7 +16,9 @@
1516
<!-- GFM-TOC -->
1617

1718

18-
**基本原理**
19+
# 0. 原理
20+
21+
**基本原理**
1922

2023
0s 表示一串 0,1s 表示一串 1。
2124

@@ -25,23 +28,79 @@ x ^ 1s = ~x x & 1s = x x | 1s = 1s
2528
x ^ x = 0 x & x = x x | x = x
2629
```
2730

28-
- 利用 x ^ 1s = \~x 的特点,可以将位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。
29-
- 利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。
30-
- 利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。
31+
利用 x ^ 1s = \~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。
32+
33+
```
34+
1^1^2 = 2
35+
```
36+
37+
利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。
38+
39+
```
40+
01011011 &
41+
00111100
42+
--------
43+
00011000
44+
```
45+
46+
利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。
47+
48+
```
49+
01011011 |
50+
00111100
51+
--------
52+
01111111
53+
```
54+
55+
**位与运算技巧**
3156

32-
位与运算技巧:
57+
n&(n-1) 去除 n 的位级表示中最低的那一位 1。例如对于二进制表示 01011011,减去 1 得到 01011010,这两个数相与得到 01011010。
3358

34-
- n&(n-1) 去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 得到 10110011,这两个数相与得到 10110000。
35-
- n&(-n) 得到 n 的位级表示中最低的那一位。-n 得到 n 的反码加 1,对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。
36-
- n-n&(\~n+1) 去除 n 的位级表示中最高的那一位。
59+
```
60+
01011011 &
61+
01011010
62+
--------
63+
01011010
64+
```
3765

38-
移位运算:
66+
n&(-n) 得到 n 的位级表示中最低的那一位 1。-n 得到 n 的反码加 1,也就是 -n=\~n+1。例如对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。
3967

40-
- \>\> n 为算术右移,相当于除以 2<sup>n</sup>;
41-
- \>\>\> n 为无符号右移,左边会补上 0。
42-
- &lt;&lt; n 为算术左移,相当于乘以 2<sup>n</sup>。
68+
```
69+
10110100 &
70+
01001100
71+
--------
72+
00000100
73+
```
74+
75+
n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1) 效果一样。
76+
77+
**移位运算**
78+
79+
\>\> n 为算术右移,相当于除以 2<sup>n</sup>,例如 -7 >> 2 = -2。
80+
81+
```
82+
11111111111111111111111111111001 >> 2
83+
--------
84+
11111111111111111111111111111110
85+
```
86+
87+
\>\>\> n 为无符号右移,左边会补上 0。例如 -7 >>> 2 = 1073741822。
88+
89+
```
90+
11111111111111111111111111111001 >>> 2
91+
--------
92+
00111111111111111111111111111111
93+
```
94+
95+
&lt;&lt; n 为算术左移,相当于乘以 2<sup>n</sup>。-7 << 2 = -28。
96+
97+
```
98+
11111111111111111111111111111001 << 2
99+
--------
100+
11111111111111111111111111100100
101+
```
43102

44-
** mask 计算**
103+
**mask 计算**
45104

46105
要获取 111111111,将 0 取反即可,\~0。
47106

notes/Leetcode 题解 - 位运算.md

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<!-- GFM-TOC -->
2+
* [0. 原理](#0-原理)
23
* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
34
* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
45
* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
@@ -15,7 +16,9 @@
1516
<!-- GFM-TOC -->
1617

1718

18-
**基本原理**
19+
# 0. 原理
20+
21+
**基本原理**
1922

2023
0s 表示一串 0,1s 表示一串 1。
2124

@@ -25,23 +28,79 @@ x ^ 1s = ~x x & 1s = x x | 1s = 1s
2528
x ^ x = 0 x & x = x x | x = x
2629
```
2730

28-
- 利用 x ^ 1s = \~x 的特点,可以将位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。
29-
- 利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。
30-
- 利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。
31+
利用 x ^ 1s = \~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。
32+
33+
```
34+
1^1^2 = 2
35+
```
36+
37+
利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。
38+
39+
```
40+
01011011 &
41+
00111100
42+
--------
43+
00011000
44+
```
45+
46+
利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。
47+
48+
```
49+
01011011 |
50+
00111100
51+
--------
52+
01111111
53+
```
54+
55+
**位与运算技巧**
3156

32-
位与运算技巧:
57+
n&(n-1) 去除 n 的位级表示中最低的那一位 1。例如对于二进制表示 01011011,减去 1 得到 01011010,这两个数相与得到 01011010。
3358

34-
- n&(n-1) 去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 得到 10110011,这两个数相与得到 10110000。
35-
- n&(-n) 得到 n 的位级表示中最低的那一位。-n 得到 n 的反码加 1,对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。
36-
- n-n&(\~n+1) 去除 n 的位级表示中最高的那一位。
59+
```
60+
01011011 &
61+
01011010
62+
--------
63+
01011010
64+
```
3765

38-
移位运算:
66+
n&(-n) 得到 n 的位级表示中最低的那一位 1。-n 得到 n 的反码加 1,也就是 -n=\~n+1。例如对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。
3967

40-
- \>\> n 为算术右移,相当于除以 2<sup>n</sup>;
41-
- \>\>\> n 为无符号右移,左边会补上 0。
42-
- &lt;&lt; n 为算术左移,相当于乘以 2<sup>n</sup>。
68+
```
69+
10110100 &
70+
01001100
71+
--------
72+
00000100
73+
```
74+
75+
n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1) 效果一样。
76+
77+
**移位运算**
78+
79+
\>\> n 为算术右移,相当于除以 2<sup>n</sup>,例如 -7 >> 2 = -2。
80+
81+
```
82+
11111111111111111111111111111001 >> 2
83+
--------
84+
11111111111111111111111111111110
85+
```
86+
87+
\>\>\> n 为无符号右移,左边会补上 0。例如 -7 >>> 2 = 1073741822。
88+
89+
```
90+
11111111111111111111111111111001 >>> 2
91+
--------
92+
00111111111111111111111111111111
93+
```
94+
95+
&lt;&lt; n 为算术左移,相当于乘以 2<sup>n</sup>。-7 << 2 = -28。
96+
97+
```
98+
11111111111111111111111111111001 << 2
99+
--------
100+
11111111111111111111111111100100
101+
```
43102

44-
** mask 计算**
103+
**mask 计算**
45104

46105
要获取 111111111,将 0 取反即可,\~0。
47106

0 commit comments

Comments
 (0)