位运算
原码、反码和补码
二进制代码 | 无符号数值 | 原码值 | 反码值 | 补码值 |
---|---|---|---|---|
0000 0000 | 0 | +0 | +0 | +0 |
0000 0001 | 1 | +1 | +1 | +1 |
... | ... | ... | ... | ... |
0111 1110 | 126 | +126 | +126 | +126 |
0111 1111 | 127 | +127 | +127 | +127 |
1000 0000 | 128 | -0 | -127 | -128 |
1000 0001 | 129 | -1 | -126 | -127 |
1000 0010 | 130 | -2 | -125 | -126 |
... | ... | ... | ... | ... |
1111 1101 | 253 | -125 | -2 | -3 |
1111 1110 | 254 | -126 | -1 | -2 |
1111 1111 | 255 | -127 | -0 | -1 |
0x3f3f3f3f
与memset
见《进阶指南》第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;
}