【位运算】位运算判断奇偶数、位运算求和、位运算求平均数、位运算求二进制1的个数

本文深入探讨了位运算在判断奇偶数、求平均数、两数之和及二进制1的个数等场景的应用。通过具体算法实现,如x&(x-1)判断奇偶、位运算求平均数、递归实现加法运算及计算二进制中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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值