第11题 二进制中1的个数
题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
class Solution {
public:
int NumberOf1(int n) {
int ans = 0;
while(n!=0){
++ans;
n = n & (n-1);
}
return ans;
}
};
思路:
这是一种快速的求1方法,n与n-1做位&运算得到n从右往左的第一位为1的位置开始(包含)到末位都变成0,也就是每次循环都只遍历1的位置,跳过0的位置。
补码:
补码
1.负数的补码:求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
2.在补码表示中,最高位(符号位)表示数的正负,在形式上与原码相同,即 0正 1负。但补码的符号位是数值的一部分,由补码定义式计算而得。例如,负小数补码中为 1,这个 1是真值(负)加模 2后产生

这篇博客介绍了如何使用位操作快速计算一个整数在32位二进制表示中1的个数。通过n与n-1做位与运算,可以有效地遍历并消除二进制表示中的1,从而统计1的个数。这种方法适用于包括负数(补码表示)在内的所有整数。此外,还解释了补码的概念及其在计算机中的应用。
588

被折叠的 条评论
为什么被折叠?



