剑指Offer:二进制中1的个数
剑指Offer:二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目分析
我们学习两个位运算:
第一个是右移:
在Java中右移动又分为:
- 有符号右移(如上图,正数补0,负数补1),表示为 n>>1,即右移动一位。
- 无符号右移(同上图,但是通通补0),表示为 n>>>1,即无符号右移动一位。
第二个是与运算:
好,知道这两个操作后,我们还需要知道一个常识,Java中int是32位,所以我们将末尾与1做与运算,如果为1则统计,接着不断无符号右移即可!
Java题解
public int NumberOf1(int n) { int ans = 0; //右移位如何终止,int32位 for(int i=1;i<=32;i++){ if((n&1)==1) ans++; n = n>>>1; } return ans; }