1. x&(x-1)的妙用
参考 https://blog.csdn.net/qq_41822235/article/details/81349232
//1.1 求二进制中1的个数
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
//注: 每执行一次 x = x & (x-1),会将x用二进制表示时最右边的一个1变为0
x = x & (x-1);
}
return countx;
}
//1.2 判断一个数(x)是否是2的n次方
#include <stdio.h>
int func(int x)
{// 如果一个数是2的n次方,那么这个数用二进制表示时其最高位为1,其余位为0
if(!x) return 0;
if( (x & (x-1)) == 0 ) // x && !(x&(x-1)); //排除0
return 1;
else
return 0;
}
2. 不使用+、-、×、÷ 求两数的和
/*
第一步: 不考虑进位,对每一位相加。
0加0 与 1加1的结果都0,0加1与1加0的结果都是1。这和异或的结果是一样的。
第二步: 进位。
只有1加1时,会向前产生一个进位,可以想象成两个数先做'位与'运算,然后再'左移'一位。
第三步:把前两个步骤的结果相加。
*/
int Add(int num1, int num2)
{
int sum, carry;
do { // 异或 解决'当前位', 与 和 左移 解决'进位'
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
} while(num2 != 0);
return num1;
}