You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.4 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
int lowbit(int x) {
return x & (-x);
}
//输出十进制对应的二进制数(模板)
void print(int n) {
//输出8个数位的二进制数
for (int i = 7; i >= 0; i--)
printf("%d", n >> i & 1);
printf("\n");
}
const int N = 12;
int sum[N];
int main() {
int x = 28;//二进制 00011100;
cout << "初始数字:" << x << endl;
cout << "二进制表示:";
print(x);
cout << "仅有末位1" << lowbit(x) << endl;
cout << "去掉末位1" << (x & ~lowbit(x)) << endl;
//前缀和的lowbit加速技巧
for (int i = 0; i < 4; i++) sum[1 << i] = 1; //按数位压缩方式存入前缀和数组[前缀和数组下标从1开始]
cout << "实际的存储情况:" << endl;
for (int i = 0; i < 9; i++) cout << i << " " << sum[i] << endl;
//这里补充一下~这个逻辑运算符,它的作用是把一个二进制数每一位取反 即每一位的0变成1,1变成0
//所以i&~lowbit(i)的意义为去掉一个二进制数的lowbit后的值
for (int i = 1; i < (1 << 4); i++) {
sum[i] = sum[i & ~lowbit(i)] + sum[lowbit(i)];
cout << "i=" << i << " sum[i]=" << sum[i] << endl;
}
//每次去掉最后一个1
for (int j = x; j; j -= lowbit(j))//枚举可能的上一次状态
cout << j << endl;
return 0;
}