#include 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; }