位运算
// 1. 利用或操作 `|` 和空格将英文字符转换为小写
('a' | ' ') = 'a'
('A' | ' ') = 'a'
// 2. 利用与操作 `&` 和下划线将英文字符转换为大写
('b' & '_') = 'B'
('B' & '_') = 'B'
// 3. 利用异或操作 `^` 和空格进行英文字符大小写互换
('d' ^ ' ') = 'D'
('D' ^ ' ') = 'd'
// 4. 不用临时变量交换两个数
int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
// 现在 a = 2, b = 1
// 5. 加一
int n = 1;
n = -~n;
// 现在 n = 2
// 6. 减一
int n = 2;
n = ~-n;
// 现在 n = 1
// 7. 判断两个数是否异号
int x = -1, y = 2;
boolean f = ((x ^ y) < 0); // true
int x = 3, y = 2;
boolean f = ((x ^ y) < 0); // false
//数组长度是 2 的幂次方的情况,求余数
index & (arr.length - 1)
//消除数字 n 的二进制表示中的最后一个 1
n & (n-1)
//一个数和它本身做异或运算结果为 0,一个数和 0 做异或运算的结果为它本身
//交换律和结合律
a ^ a = 0
a ^ 0 = a
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
33
34
35
36
37
38
39
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
33
34
35
36
37
38
39
# 191. 位1的个数 - 力扣(LeetCode) (opens new window)
class Solution {
public int hammingWeight(int n) {
int res = 0;
while (n != 0) {
n = n & (n - 1);
res++;
}
return res;
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 231. 2 的幂 - 力扣(LeetCode) (opens new window)
一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1
class Solution {
public boolean isPowerOfTwo(int n) {
if (n <= 0) return false;
return (n & (n - 1)) == 0;
}
}
1
2
3
4
5
6
2
3
4
5
6
# 268. 丢失的数字 - 力扣(LeetCode) (opens new window)
class Solution {
public int missingNumber(int[] nums) {
int n = nums.length;
int res = 0;
// 先和新补的索引异或一下
res ^= n;
// 和其他的元素、索引做异或
for (int i = 0; i < n; i++)
res ^= i ^ nums[i];
return res;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
编辑 (opens new window)
上次更新: 2025/06/13, 00:51:28