二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
package SwordOffer;
/** * @author jinhuajian * @data 2018年12月28日---下午10:34:01 * @blog https://me.csdn.net/qq_37119939 */
public class Solution_11 {
public int NumberOf1(int n) {
// 补码:正数不变,负数符号位固定为1不变,其他位置取反加1
// 直接右移,并和1与,负数右移高位补1,不能退出循环
int count = 0;
while (n != 0) {
n = n & (n - 1);// n = 1100, n-1 = 1011 ,n&(n-1)=1000,与一次原数少一个1,
count++;
}
return count;
}
public int NumberOf1_01(int n) {
// 先和01(31)=0x7FFFFFFF与一下 int占4byte,32位bit
// 如果是负数则有一个1
int count = 0;
if (n < 0) {
n = n & 0x7FFFFFFF;
count++;
}
while (n != 0) {
if ((n & 1) == 1) {
count++;
}
n = n >> 1;
}
return count;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution_11 s = new Solution_11();// int 4个字节,32位
int res = s.NumberOf1(-3); // -1 二进制 10(30)1 反码 11(30)0, 补码 11(30)1 ,注意:反码-1,不借位
// -3 二进制10(29)11 反码 11(29)00 ,补码 11(29)01
System.out.println(res);
System.out.println(s.NumberOf1_01(-3));
}
}
python版
class Solution:
def NumberOf1(self, n):
# write code here
count = 0
if n <0:
count +=1
n = n & 0x7FFFFFFF
while n:
n = n & (n-1)
count += 1
return count