位运算之求一个数的二进制表示中1的个数

一、基本位运算

右移运算:按位右移,左补符号位
左移运算:按位左移,右补0位
针对某一位操作(此处1、0并非常数,而是对应需要变换的位置为1或0):
得到1:x|1;
得到0:x&0;
取反: x^1;

二、做题步骤

1.确定符号
2.确定数字
3.构造数字

eg:第k位由1变为0  x&(~(1<<(k-1)))
    右数第k位取反  x^(1<<(k-1))
    第k位由1变为0  x|(1<<(k-1))
    取末k位        x&((1<<k)-1)
    取右数第k位    (x>>(k-1))&1

三、求一个数的二进制表示中1的个数

int Bits(unsigned char ch)    //无符号
{
    int cout = 0;
    /*while (ch != 0)
    {
        if ((ch & 1) == 1)
            cout++;
        ch >>= 1;
    }*/
    while (ch != 0)
    {
        ch = ch & (ch - 1);
        cout++;
    }
   /* int bits[256] = { 0,1,1,2,1,2,2,3,1 };
    return bits[ch];*/
    return cout;
}
int main()
{
    int x = 10;
    printf("%d ", x & (x - 1));     //丢弃二进制右数第一个1
    printf("%d ", Bits(10));            //-1
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值