位运算判断奇偶数:
2,4,6,8,10这样的数转化为二进制是10,100,1000,10000,将其减1后做与运算为0;
x & (x-1) == 0 //偶数
x & (x-1) != 0 //奇数
位运算求平均数:
int f(int x,int y)
{
return (x & y) + ((x ^ y) >> 1);
}
x & y //求相同位的与;
x ^ y //取x和y的不同位 ;
右移相当于除2 ;
位运算求两数之和:
int Add(int a,int b)
{
if(b == 0) return a; //没有进位的时候完成运算
int sum,carry;
sum = a ^ b; //完成第一步没有进位的加法运算
carry = (a & b) << 1; //完成第二步进步并且左移运算
return Add(sum,carry); //进行递归,相加
}
位运算求二进制1的个数:
int NumberOf1(int n)
{
int num = 0;
while(n)
{
num++;
n = (n-1) & n; //把二进制位中最右边的1变为0
}
return num;
}
利用标记位flag进行移动
int NumberOf1(int n)
{
int num = 0;
int flag = 1;
while(flag)
{
if((n & flag) != 0)
{
num++;
}
flag = flag << 1; //移动flag //不可以移动n
//会造成死循环,如果是负数会不断补1
}
return num;
}