@title:位运算
@author:五心先生
@time:2022-01-20
位运算O(1)的一些技巧
1. 成对变换
对于非负整数n:
当n为偶数时,n xor 1 等于 n+1
当n为奇数时,n xor 1 等于 n-1
因此,“0,1”、“2,3”、“4,5”关于 xor 1运算成对变换。
2. lowbit运算
求出二进制的数的右边第一个1的值。
例子 lowbit(110111000) = 1000。
过程:
n = 110111000
-n = 001000111 + 1
-n = 001001000
n & -n == n的二进制右边的第一个1。如果是n为2次幂的话。则 (n & -n == n)
int lowbit(int n)
{
// (~n + 1) == -n n的补码是 ~n + 1
return (-n) & n;
}
3. 用异或交换位置
有a,b两个数,交换一下它们的位置。
例子:交换 4,7
过程:
a = 4 = 100
b = 7 = 111
t = a ^ b = 011
a = t ^ a = 111
b = t ^ a = 100
int change(int a,int b)
{
t = a ^ b;
a = t ^ a;
b = t ^ a;
}
4. 判断一个数的二进制的个数
int count(int n )
{
int s = 0;
for (int k = n; k; k >>= 1) s += k & 1;
return s;
}
5. ! (非)和 ~(取反) 有区别。
~5 = 010;
!5 = 0;
6. 看一个数的第k位是0还是1
int if_count(int n)
{
if (n >> k & 1) return 1;
return 0;
}
- 易错点:and和&的区别
>>> 5 and 4
4 # 这是因为and判断是根据布尔类型判断,5为True,4为True,输出该值。这整个式子是真的
>>> 4 and 5
5
>>> 5 and 0
0 # 5为True, 0为假,还是输出该值。只是这整个式子是假的。
# 下面&是根据按位运算来进行输出的。
>>> 5 & 4
4
>>> 4 & 5
4