【位運算】位運算判斷奇偶數、位運算求和、位運算求平均數、位運算求二進制1的個數

位運算判斷奇偶數:

    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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章