位运算:
第一个操作。
n的二进制表示中第k位数字是几
这里的第k位指的是,从右往左第0位,第1位,第2位
1:先把第k位数字移到最后一位 n>>k
2:看个位是几 x&1
结合起来就是n>>k&1
第二个操作:
lowbit操作
lowbit(x)的作用是返回x的最后一位1
比如x=1010,那么lowbit(x) = 10,等于2
x=101000,lowbit(x) = 1000
lowbit返回的是一个二进制数,这个二进制数的头一位1是原数的最后一位1
lowbit是怎么实现的
x & -x = x & (~x + 1)
计算机数字运算均是基于补码的。
-x = ~x + 1这句话是针对补码而言的
负x等于取反x加1
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() { 4 int n = 10; 5 unsigned int x = -n; 6 for (int i = 31; i >= 0; i--) { 7 cout << (x >> i & 1); 8 } 9 return 0; 10 }
应用:统计x里面1的个数
思想就是每次把最后一位1去掉
当x等于0的时候,就没有1了
减了多少次,就有几个1
1 #include <bits/stdc++.h> 2 using namespace std; 3 int lowbit(int x) { 4 return x & -x; 5 } 6 int main() { 7 int n; 8 cin >> n; 9 while (n--) { 10 int x; 11 cin >> x; 12 int res = 0; 13 while (x) { 14 x -= lowbit(x); 15 res++; 16 } 17 cout << res << " "; 18 } 19 return 0; 20 }