位運算判斷奇偶數:
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;
}