计算二进制中 1 的个数
题目描述
输入一个 32 位整数,输出该数二进制表示中 1 的个数。
注意:
- 负数在计算机中用其绝对值的补码来表示。
样例 1
输入:9
输出:2
解释:9 的二进制表示是 1001,一共有 2 个 1。
样例 2
输入:-2
输出:31
解释:-2 在计算机里会被表示成 11111111111111111111111111111110,
一共有 31 个 1。
解法
解法一
利用整数 1,依次左移每次与 n 进行与运算,若结果不为 0,说明这一位上数字为 1,++cnt。
此解法 i 需要左移 32 次。
不要用 n 去右移并与 1 进行与运算,因为 n 可能为负数,右移时会陷入死循环。
class Solution {
/**
* 求二进制中 1 的个数
*
* @param n 整数
* @return 该整数的二进制中 1 的个数
*/
public int NumberOf1(int n) {
int i = 1;
int cnt = 0;
while (i != 0) {
if ((n & i) != 0) {
++cnt;
}
i <<= 1;
}
return cnt;
}
}
解法二(推荐)
运算 (n - 1) & n
,直至 n 为 0。运算的次数即为 n 的二进制中 1 的个数。
因为 n-1 会将 n 的最右边一位 1 改为 0,如果右边还有 0,则所有 0 都会变成 1。结果与 n 进行与运算,会去除掉最右边的一个 1。
举个栗子:
若 n = 1100,
n - 1 = 1011
n & (n - 1) = 1000
即:把最右边的 1 变成了 0。
把一个整数减去 1 之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中最右边的 1 变成 0。很多二进制的问题都可以用这种思路解决。
class Solution {
/**
* 求二进制中 1 的个数
*
* @param n 整数
* @return 该整数的二进制中 1 的个数
*/
public int NumberOf1(int n) {
int cnt = 0;
while (n != 0) {
++cnt;
n &= (n - 1);
}
return cnt;
}
}
解法三
利用 Java API。
class Solution {
/**
* 求二进制中 1 的个数
*
* @param n 整数
* @return 该整数的二进制中 1 的个数
*/
public int NumberOf1(int n) {
return Integer.bitCount(n);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 剪绳子 绳子长度乘积最大值
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论