mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-10-28 06:34:41 +00:00
Update Leetcode 题解 - 位运算.md
移位运算符的转义和 2 的 n 次方写法调整为能正确显示;第 10 题标题改为“求一个数的补数”,与 LeetCode 476 一致;bitCount 拼写;书名改为纯文本;代码块标注语言。
This commit is contained in:
+18
-18
@@ -11,7 +11,7 @@
|
||||
* [7. 判断一个数是不是 2 的 n 次方](#7-判断一个数是不是-2-的-n-次方)
|
||||
* [8. 判断一个数是不是 4 的 n 次方](#8--判断一个数是不是-4-的-n-次方)
|
||||
* [9. 判断一个数的位级表示是否不会出现连续的 0 和 1](#9-判断一个数的位级表示是否不会出现连续的-0-和-1)
|
||||
* [10. 求一个数的补码](#10-求一个数的补码)
|
||||
* [10. 求一个数的补数](#10-求一个数的补数)
|
||||
* [11. 实现整数的加法](#11-实现整数的加法)
|
||||
* [12. 字符串数组最大乘积](#12-字符串数组最大乘积)
|
||||
* [13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数](#13-统计从-0--n-每个数的二进制表示中-1-的个数)
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
0s 表示一串 0,1s 表示一串 1。
|
||||
|
||||
```
|
||||
```text
|
||||
x ^ 0s = x x & 0s = 0 x | 0s = x
|
||||
x ^ 1s = ~x x & 1s = x x | 1s = 1s
|
||||
x ^ x = 0 x & x = x x | x = x
|
||||
@@ -32,13 +32,13 @@ x ^ x = 0 x & x = x x | x = x
|
||||
|
||||
利用 x ^ 1s = \~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。
|
||||
|
||||
```
|
||||
```text
|
||||
1^1^2 = 2
|
||||
```
|
||||
|
||||
利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。
|
||||
|
||||
```
|
||||
```text
|
||||
01011011 &
|
||||
00111100
|
||||
--------
|
||||
@@ -47,7 +47,7 @@ x ^ x = 0 x & x = x x | x = x
|
||||
|
||||
利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。
|
||||
|
||||
```
|
||||
```text
|
||||
01011011 |
|
||||
00111100
|
||||
--------
|
||||
@@ -58,7 +58,7 @@ x ^ x = 0 x & x = x x | x = x
|
||||
|
||||
n&(n-1) 去除 n 的位级表示中最低的那一位 1。例如对于二进制表示 01011011,减去 1 得到 01011010,这两个数相与得到 01011010。
|
||||
|
||||
```
|
||||
```text
|
||||
01011011 &
|
||||
01011010
|
||||
--------
|
||||
@@ -67,7 +67,7 @@ n&(n-1) 去除 n 的位级表示中最低的那一位 1。例如对于二进制
|
||||
|
||||
n&(-n) 得到 n 的位级表示中最低的那一位 1。-n 得到 n 的反码加 1,也就是 -n=\~n+1。例如对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。
|
||||
|
||||
```
|
||||
```text
|
||||
10110100 &
|
||||
01001100
|
||||
--------
|
||||
@@ -78,25 +78,25 @@ n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1
|
||||
|
||||
**移位运算**
|
||||
|
||||
\\>\\> n 为算术右移,相当于除以 2n,例如 -7 \\>\\> 2 = -2。
|
||||
\>\> n 为算术右移,相当于除以 2<sup>n</sup> 并向下取整,例如 -7 \>\> 2 = -2。
|
||||
|
||||
```
|
||||
```text
|
||||
11111111111111111111111111111001 >> 2
|
||||
--------
|
||||
11111111111111111111111111111110
|
||||
```
|
||||
|
||||
\\>\\>\\> n 为无符号右移,左边会补上 0。例如 -7 \\>\\>\\> 2 = 1073741822。
|
||||
\>\>\> n 为无符号右移,左边会补上 0。例如 -7 \>\>\> 2 = 1073741822。
|
||||
|
||||
```
|
||||
```text
|
||||
11111111111111111111111111111001 >>> 2
|
||||
--------
|
||||
00111111111111111111111111111111
|
||||
```
|
||||
|
||||
\<\< n 为算术左移,相当于乘以 2n。-7 \<\< 2 = -28。
|
||||
\<\< n 为算术左移,相当于乘以 2<sup>n</sup>。-7 \<\< 2 = -28。
|
||||
|
||||
```
|
||||
```text
|
||||
11111111111111111111111111111001 << 2
|
||||
--------
|
||||
11111111111111111111111111100100
|
||||
@@ -167,7 +167,7 @@ public int hammingDistance(int x, int y) {
|
||||
}
|
||||
```
|
||||
|
||||
可以使用 Integer.bitcount() 来统计 1 个的个数。
|
||||
可以使用 Integer.bitCount() 来统计 1 的个数。
|
||||
|
||||
```java
|
||||
public int hammingDistance(int x, int y) {
|
||||
@@ -229,7 +229,7 @@ public int missingNumber(int[] nums) {
|
||||
|
||||
将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。
|
||||
|
||||
diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。
|
||||
diff &= -diff 得到 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。
|
||||
|
||||
```java
|
||||
public int[] singleNumber(int[] nums) {
|
||||
@@ -294,7 +294,7 @@ private int reverseByte(byte b) {
|
||||
|
||||
## 6. 不用额外变量交换两个整数
|
||||
|
||||
[程序员代码面试指南 :P317](#)
|
||||
程序员代码面试指南 :P317
|
||||
|
||||
```java
|
||||
a = a ^ b;
|
||||
@@ -373,7 +373,7 @@ public boolean hasAlternatingBits(int n) {
|
||||
}
|
||||
```
|
||||
|
||||
## 10. 求一个数的补码
|
||||
## 10. 求一个数的补数
|
||||
|
||||
476\. Number Complement (Easy)
|
||||
|
||||
@@ -387,7 +387,7 @@ Explanation: The binary representation of 5 is 101 (no leading zero bits), and i
|
||||
|
||||
题目描述:不考虑二进制表示中的首 0 部分。
|
||||
|
||||
对于 00000101,要求补码可以将它与 00000111 进行异或操作。那么问题就转换为求掩码 00000111。
|
||||
对于 00000101,要求补数可以将它与 00000111 进行异或操作。那么问题就转换为求掩码 00000111。
|
||||
|
||||
```java
|
||||
public int findComplement(int num) {
|
||||
|
||||
Reference in New Issue
Block a user