基础算法_06_位运算
作者:
综上所述_
,
2024-11-09 18:20:24
,
所有人可见
,
阅读 4
(1)x >> k & 1,x 的二进制的第 k 位
1)把第 k 位移到最后: x >> k
2)看个位是几: x & 1
=> x >> k & 1
例: 10110011
&00000001 (&1)
00000001
(2)lowbit(x): x & -x,返回 x 的二进制的最后一位 1(返回时附带其后面的0)
例: x = 1010,lowbit(x) = 10
x = 101000,lowbit(x) = 1000
int lowbit(int x) {
return x & -x;
}
原理: x & -x = x & (~x + 1)
-x = 0 - x,0借位,0000 - x => 10000 - x = ~x + 1(负数: 原数补码取反 + 1)
例: 01010100
&10101100
00000100
(1)移位,判断个位
#include <iostream>
using namespace std;
int n, x;
int main() {
scanf("%d", &n);
while (n--) {
scanf("%d", &x);
int res = 0;
while (x) {
res += x & 1; // 加 1: if (x & 1) res++;
x >>= 1; // 往后移
}
/*
res 的值每次会通过 printf 调用写入输出流缓冲区,
并在程序结束时刷新到终端显示
*/
printf("%d ", res);
}
return 0;
}
(2)用 lowbit 每次减去最后一位 1
#include <iostream>
using namespace std;
int n, x;
int lowbit(int x) {
return x & -x;
}
int main() {
scanf("%d", &n);
while (n--) {
scanf("%d", &x);
int res = 0;
while (x) {
x -= lowbit(x); // 每次减去 x 最后一位 1
res++;
}
printf("%d ", res);
}
return 0;
}