【位运算】位运算判断奇偶数、位运算求和、位运算求平均数、位运算求二进制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;
}

 

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