首页 > 其他 > 详细

二进制中1的个数

时间:2020-02-13 13:54:32      阅读:66      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 

基础知识

正整数n的补码x有:n+x=10000000000000000
                                 x=10000....00-n
负整数-n在二进制里表示就是:-n绝对值的补码。即x

这里有个难点是如何处理负数。
在C++中如果我们右移一个负整数,系统会自动在最高位补1,这样会导致 nn 永远不为0,就死循环了。
解决办法是把 nn 强制转化成无符号整型,这样 nn 的二进制表示不会发生改变,但在右移时系统会自动在最高位补0

 int NumberOf1(int n) {
        int res = 0;
        unsigned int un = n; 
        while (un) 
        {
            res += un & 1;
            un >>= 1;
        }
        return res;
    }

 

遇到问题

1.

res += un & 1;
这句刚开始写成
res = res  +  un & 1;
不能得到正确答案。
后发现:+的优先级高于&。
会先执行+操作,再执行&

 2

 

 un >>= 1;
刚开始写成
 un >> 1;

 

 

3

 while (un) res += un & 1, un >>= 1;
效果等同于
  while (un) 
        {
            res += un & 1;
            un >>= 1;
        }

 


       

二进制中1的个数

原文:https://www.cnblogs.com/make-big-money/p/12303233.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!