剑指offer面试题10 二进制中1的个数

考察点

位运算

知识点

位运算针对二进制位进行运算,包括(&)与运算,(|)或运算,(^)异或运算,(~)取反,(<<)左
移位,(>>)右移位,(>>>)无符号右移运算
与运算:0&0=0,0&1=0,1&0=0,1&1=1
或运算:0|0=0,0|1=1,1|0=1,1|1=1
异或:0^0=0,0^1=1,1^0=0,1^1=0
左移:m<<n表示m左移n位,最右边补0,左移1位相当于乘以2
右移:m>>n表示m右移n位,最左边补符号位,右移1位相当于除以2
无符号右移:m>>>n表示m无符号右移n位,最左边补0,这意味着一个负数在无符号右移后可
能会变成正数
注意数字的位运算是每一位二进制位位运算的结果
我们知道任何数据或者代码在计算机中都是二进制的存储方式,
因此位运算可以极大的提高计算速度。我们常见的数字的表示
方式其实都是10进制,比如12345这种

题目

分析
要求二进制中1的个数,这个时候思维一定要往位运算上靠,如果二进制位与数字1做与运算还是1的话那就肯定能说明这个二进制位是1,我们遍历这个数字的二进制序列就能够统计出1的个数了。有俩种很直观的思路,第一种思路不断右移该数字并且让该数字与1做与运算直到该数字为0为止,右移最右边不断补0因此这个数字最终肯定会变成0,如果用普通右移的话这个思路的前提是这个数字一定不能是负数,如果是负数的话要陷入死循坏了,当然用无符号数右移也是可以满足诉求的。还有种思路是左移数字1,这样从最右边开始向左遍历二进制序列,判断每个二进制位是否是1,直到数字1变成0为止。当然对于二进制位来说判断是1的条件是俩个二进制位与运算是1就可以,但是对于一个数字来说判断条件则是俩个数字与运算结果大于0

public class Ten {
	public static void main (String[] args) {
		System.out.println(count(9));
	}
	public static int count(int num) {
		int flag = 1;
		int cnt = 0;
		while (flag!=0) {
			int d = flag & num;
			if ((flag & num) > 0) {
				cnt ++;
			}
			flag <<= 1;
		}
		return cnt;
	}
}

你可能感兴趣的:(java,leetcode,算法,数据结构,面试)