二进制最低位1

学习自如何求一个数的二进制最低位1在哪里

  • 补码:
    ① 正数的补码为本身;
    ② 负数的补码:
例如负数为a,对应正数为b,利用a+b=0

写负数a补码的方法1:先填符号位1,其余位在b的基础上全部取反,再+1
最高位是1,其余所有位a和b相反,因此a+b=1,再+1溢出为0;

写负数a补码的方法2:在b基础上,保留最低位1和右侧的0不变,再把左侧全部位取反
例如b的最低位1100,且左侧全部位相反,因此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;
}

猜你喜欢

转载自blog.csdn.net/jiuri1005/article/details/114898743