位运算

原码、反码和补码

二进制代码无符号数值原码值反码值补码值
0000 00000+0+0+0
0000 00011+1+1+1
...............
0111 1110126+126+126+126
0111 1111127+127+127+127
1000 0000128-0-127-128
1000 0001129-1-126-127
1000 0010130-2-125-126
...............
1111 1101253-125-2-3
1111 1110254-126-1-2
1111 1111255-127-0-1

0x3f3f3f3fmemset

见《进阶指南》第3页。

二进制状态压缩

见《进阶指南》第6页。

成对变换

见《进阶指南》第9页。

lowbit运算

见《进阶指南》第9页。

int lowbit (int x) {
    return x & -x;
}

整数二进制表示下所有是1的位

见《进阶指南》第10页。

#include <iostream>
using namespace std;
int log_2[37]; // log_2(2的i次幂) = i
int lowbit (int x) { return x & -x; }

int main () {
    for (int i = 0; i < 36; ++ i) log_2[(1ll << i) % 37] = i;
    int x;
    while (cin >> x) {
        while (x > 0) {
            cout << log_2[lowbit(x) % 37] << ' ';
            x -= lowbit(x);
        }
        cout << endl;
    }
    return 0;
}
最后修改于: