剑指Offer_11

题目

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

解题思路

解法一:
对于输入的n不做改变,使用flag = 1对n的每一位进行检查是否等于1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution {
public int NumberOf1(int n) {
int cnt = 0;
int flag = 1;
while(flag != 0){
if((flag & n) != 0){
++cnt;
}
flag <<= 1;
}
return cnt;
}
}

解法二:
每次循环检查n的末位,是否等于1
利用java的 >>>
逻辑右移或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充左侧的空位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution {
public int NumberOf1(int n) {
int cnt = 0;
while(n != 0){
if((n & 1) == 1){
++cnt;
}
n >>>= 1;
}
return cnt;
}
}