如何判断整数x的二进制中含有多少个1

主要是利用位操作来判断每一位是否为1

方法一:

清除整数a最右边的1可以使用这个操作:a&(a-1)

 所以可以利用这个方法来得到1的个数:

int count_one(unsigned x){
     int count= 0;
     while(x){
        count++;
        x=x&(x- 1);
    }
     return count;
}

方法二:

对整数进行移位,然后判断最后一位是否为1

int count_one2(unsigned x){
     int count= 0;
     int i= 0;
     while(i< 32){
         if((x>>i)& 0x1)
            count++;
        i++;
    }
     return count;
}

方法三:

这个方法和方法二类似,只是每次移动4位。

int count_one3(unsigned x){
     static  const  int hex[]={ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
     int count= 0;
     int i= 0;
     while(i< 8){
        count+=hex[(x>>(i* 4))& 0xf];
        i++;
    }
     return count;

}

下面是测试程序:

int main(){
     int n= 20;
     for( int i= 0;i<n;i++){
        unsigned val=rand()% 100;
         int c1=count_one(val);
         int c2=count_one2(val);
         int c3=count_one3(val);
        cout<<val<< "   "<<c1<< "   "<<c2<< "   "<<c3<<endl; 
    }
}

 具体执行结果如下:

 

转载于:https://www.cnblogs.com/xkfz007/archive/2012/06/21/2558301.html

第一题代码及分析: ```c #include <stdio.h> int getByte(int x, int n) { return ((x >> (n << 3)) & 0xff); } int byteXor(int x, int y, int n) { x = getByte(x, n); y = getByte(y, n); return !!(x ^ y); } int main() { int x = 0x12345678; int y = 0x8654321; printf("byteXor(0x12345678, 0x8654321, 1) = %d\n", byteXor(x, y, 1)); printf("byteXor(0x12345678, 0x87344321, 2) = %d\n", byteXor(x, 0x87344321, 2)); return 0; } ``` 分析:本题需要设计一个函数 `byteXor`,比较两个整数 `x` 和 `y` 的第 `n` 个字节是否相同,如果相同返回 `0`,否则返回 `1`。由于本题 `n` 的取值范围是 0~3,因此可以用移位运算和按位与运算来实现获取 `x` 和 `y` 的第 `n` 个字节。最后用异或运算符 `^` 来比较两个字节是否相同,如果相同则返回 `0`,否则返回 `1`。 第二题代码及分析: ```c #include <stdio.h> int parityCheck(int x) { int count = 0; while (x) { if (x & 1) count++; x >>= 1; } return (count % 2) == 1; } int main() { int x = 0b101101; printf("parityCheck(0b101101) = %d\n", parityCheck(x)); x = 0b101010; printf("parityCheck(0b101010) = %d\n", parityCheck(x)); return 0; } ``` 分析:本题需要设计一个函数 `parityCheck`,计算整数 `x` 的二进制包含 1 的个数,如果个数为奇数返回 `1`,否则返回 `0`。可以用循环和按位与运算来实现计算二进制 1 的个数,然后用取模运算来判断个数是否为奇数。如果是奇数返回 `1`,否则返回 `0`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值