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

来源:互联网 发布:腾讯软件下载官方网站 编辑:程序博客网 时间:2024/06/06 08:43
判断(32位)整数的二进制表示中的1有奇数个还是偶数个
最直接的思路就是求二进制数中1的个数,然后确定是偶数还是奇数。
代码如下:
[cpp] view plaincopy
  1. // true为x二进制表示中含有奇数个1,false为偶数个1  
  2. bool OddOnes(int x)   
  3. {  
  4.     int cnt = 0;  
  5.     while(x)  
  6.     {  
  7.         cnt++;  
  8.         x &= x-1;  
  9.     }  
  10.     return cnt & 1;  
  11. }  

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

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

[cpp] view plaincopy
  1. bool OddOnes(int x)  
  2. {  
  3.     x = x ^ (x >> 1);  
  4.     x = x ^ (x >> 2);  
  5.     x = x ^ (x >> 4);  
  6.     x = x ^ (x >> 8);  
  7.     x = x ^ (x >> 16);  
  8.     return x & 1;  
  9. }  
第一次异或的结果,第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位。。。。

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

0 0
原创粉丝点击