判断二进制数中的1有奇数个还是偶数个

判断(32位)整数的二进制表示中的1有奇数个还是偶数个
最直接的思路就是求二进制数中1的个数,然后确定是偶数还是奇数。
代码如下:

// true为x二进制表示中含有奇数个1,false为偶数个1
bool OddOnes(int x) 
{
	int cnt = 0;
	while(x)
	{
		cnt++;
		x &= x-1;
	}
	return cnt & 1;
}

上述代码的就是先求x二进制中1的个数,方法就是通过x &= x-1去掉最右端的1,直到x变为0,去掉了几次1就是原x二进制中含有多少个1;然后确定个数为奇数还是偶数。

下面是利用强大的位运算来得到结果:

bool OddOnes(int x)
{
	x = x ^ (x >> 1);
	x = x ^ (x >> 2);
	x = x ^ (x >> 4);
	x = x ^ (x >> 8);
	x = x ^ (x >> 16);
	return x & 1;
}

第一次异或的结果,第i个位置上是1代表原数中第i位和第i+1位有一个为1,也就是奇数个1。也就是说,某个位为1,代表从它开始向左连续两位中1的个数是奇数(异或的本质)。
第二次异或,注意是两位两位的比较了,所有x是和x>>2做异或运算,比如,若结果第6位为1,那么代表上一次的结果的第6位和第8位有奇数个1,也就是原数中第6,7,8,9位中有奇数个1。
同样,到第五次运算结束后,过第0位为1代表0到31位共奇数个1。
整个过程就是不断的压缩信息,先用1位代表从本位开始向左的2位中1的奇偶,然后向左的4位,向左的8位。。。。

二进制运算是很强大的,平时应多注意思考和总结,恰当的使用二进制运算可以大大提高程序的效率。

参考资料:http://www.matrix67.com/blog/archives/264

    原文作者:WalkingInTheWind
    原文地址: https://blog.csdn.net/WalkingInTheWind/article/details/7249099
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞