- 补码:
① 正数的补码为本身;
② 负数的补码:
例如负数为a,对应正数为b,利用a+b=0
写负数a补码的方法1:先填符号位1,其余位在b的基础上全部取反,再+1
最高位是1,其余所有位a和b相反,因此a+b=全1,再+1溢出为0;
写负数a补码的方法2:在b基础上,保留最低位1和右侧的0不变,再把左侧全部位取反
例如b的最低位1是100,且左侧全部位相反,因此a+b会因为相同的最低位100导致溢出为0
- 求一个数x的最低位1:
最优解O(1):以前面的方法2为例,x和-x的最低位100是相同的,其余部分均相反,因此x & (-x)会得到100
本办法只能将x从最低位逐位判断了,O(sizeof(type) * 8)
-
求一个数x的第k位二进制:x >> k & 1
-
统计一个数int x的二进制1的个数:
//简单写法:不改变原数
int cnt = 0;
for (int k = 0; k < 32; ++k) {
if (x >> k & 1) ++cnt;
}
//更快,但会修改原数字
int cnt = 0;
while (x) {
x &= (x - 1);//x&(x-1)会去掉自己最低位的1
++cnt;
}