基础知识
正整数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;
}
原文链接: https://www.cnblogs.com/make-big-money/p/12303233.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/329155
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!