剑指offer JZ11二进制中1的个数
发布日期:2021-05-07 13:14:25 浏览次数:27 分类:精选文章

本文共 548 字,大约阅读时间需要 1 分钟。

二进制中1的个数

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

思路一

通过除2取余,将余数存到数组中,分别对正负数进行处理。比较繁琐,容易出错,遗漏特殊情况

思路二

把十进制看成二进制,通过位与和移位,判断每一位是否为1

怎么取移位的结果?

方式一:

n&1 这样就能取出最后一位,再循环右移n>>=1 (只能用于正数),这里用n>>>1即可解决

方式二:

(n-1)&n 这个操作可以将n二进制数最右边的一个1转为0,循环操作知道为0。(不需要像 方式一 那样取32次)
例:
二进制数 1100 减1 -> 1011
1011 & 1100 (即(n-1)&n) -> 1000

代码

方式一

public int NumberOf1(int n) {	int count = 0;	while(n != 0){		if((n & 1) == 1) count++;		n = n>>>1; 	}	return count;}

方式二

public int NumberOf1(int n) {	int count = 0;	while(n != 0){		n = (n-1) & n;        count++;    }    return count;}
上一篇:剑指offer JZ47 求1+2+3+...+n
下一篇:剑指offer JZ10 矩形覆盖

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月29日 21时55分17秒