一道和位与操作(&)相关的趣题

googleTopLanguage论坛中看到一道题目,和位与操作(&)相关。


 

先简单回顾一下什么叫做位与操作符:

位与操作(&)需要两个整型操作数,在每个位的位置,如果两个操作数对应的位都为 1,则操作结果中该位为 1,否则为 0

unsigned char b1 = 0145;   表达为二进制,结果如下

0 1 1 0 0 1 0 1

unsigned char b2 = 0257; 表达为二进制,结果如下

1 0 1 0 1 1 1 1

那么,unsigned char result = b1 & b2; 表达为二进制,结果如下

0 0 1 0 0 1 0 1


然后看题:

int test(int n) 

        int nCount = 0; 

        while(n) 
        { 
                nCount++; 
                n = n & (n - 1); 
        } 

        return nCount; 

}

test9999



 

最后解答:

“n = n & (n - 1)”说明 这其实就是一个位于操作的题目。问题是9999到底等于二进制的多少,这个需要计算出来么?常规解法是计算出来然后按位与,但是其实是也可以不用计算出来,比如论坛上有网友doyle解答如下:

假设9999的二进制表达为xxxxxxxxxx...xxx1,显然最后一位是1(因为是奇数
则可知9998二进制表达为xxxxxxxxxx...xxx0,显然最后一位是0(因为是偶数
显然,9999&9998=>9998(xxxxxxxxxx...xxx0) 
然后是9998&9997=>我不知道是多少,但是,肯定是xxxxxxxxxx...xx00 
继续下去,就是xxxxxxxxxx...xxx0xxxxxxxxxx...xxx()0()相与 

所以最后n = 9999表达为2进制时需要多少位?
于是  取整(log(9999,2))=13,所以n=14 “

非常流畅的解答!

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值