题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
python实现:
# -*- coding:utf-8 -*-
class Solution:
# 法1:最右端和1相与,然后n不断除以2,但不要用while n>0作为判断条件,
# 因为还要考虑n为负数时的情况
def NumberOf12(self, n):
# write code here
cnt = 0
# 不要用while n>0作为判断条件
for i in range(32):
if n & 0x1 == 1:
cnt += 1
n = n//2
return cnt
# 法2:除法改为右移,但不要用while n!=0作为判断条件
# 因为n为负数时,右移左端会补1
def NumberOf13(self, n):
# write code here
cnt = 0
for i in range(32):
if n & 0x1 == 1:
cnt += 1
n = n>>1
return cnt
# 法3:右移改为左移,不过不是移n,而是移mask
def NumberOf14(self, n):
# write code here
cnt = 0
mask = 0x1
for i in range(32):
if n & mask: # 注意别写成n & mask == 1
cnt += 1
mask = mask<<1
return cnt
# 法4:使用v&(v-1),总能消去右边开始的第一个1
def NumberOf15(self, n):
cnt = 0
n = n & 0xffffffff # 将python里的负数 变成无符号数
while n:
cnt += 1
n = n&(n-1)
return cnt
# 法5:使用bin()方法
def NumberOf1(self, n):
n = n & 0xffffffff # 将python里的负数 变成无符号数
return bin(n).count('1')
#注意:python 的整数不是32位,而是位数可以一直增大,所以下面的代码会陷入死循环
# 即左移并不会使得flag变为0
"""
def NumberOf1(self, n):
flag = 0x1
cnt = 0
#n = n&0xffffffff#python里的负数 变成无符号数
while flag:
if n&flag:
cnt += 1
flag <<= 1
return cnt
"""
c++实现:
class Solution {
public:
//法1
int NumberOf12(int n) {
int flag=1, cnt=0;
while(flag){
if(flag&n)
cnt++;
flag <<= 1;
}
return cnt;
}
//法2
int NumberOf1(int n) {
int cnt=0;
while(n){
cnt++;
n=n&(n-1);
}
return cnt;
}
};