题目要求,查看二进制中1的个数
1. 转换二进制统计
bin转化为二进制
def countBinary(n):
return bin(n).count('1')
- 1
- 2
2. 二进制移位
# int val; // input data
ans = 0
while val != 0:
if val & 1:
ans += 1
val >>= 1
return ans
- 1
- 2
- 3
- 4
- 5
- 6
- 7
代码中val & 1表示val 与 0x000…0001(其中有31个0)进行 & 操作。
val >>= 1表示,如果val的二进制是110,则操作之后会变成011,也就是舍去最低位,然后最高位补0.
但是如果val为负数,最高位会补1,所以对于负数还是有点问题。
我们可以转换一下思路,让一个数0x01从右向左与val的每一位进行&操作来判断
def binary2(num):
mark = 0b01
ans = 0
while mark <= num:
if mark & num:
ans += 1
mark <<= 1
return ans
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
0b二进制 0x十进制 0o二进制
3. 技巧法
对于上一种解法中,无用操作是,如果当前位是0, 还是会做判断,然后一位一位的移动。
如果,给你一种超能力,你一下可以对从右向左的第一位1直接判断,遇到0直接略过,那效率是不是很快。
现考虑二进制数:val :1101000, val-1: 1100111 那么val & (val-1) : 1100000
def countN(num):
ans = 0
while num:
ans += 1
num &= (num-1)
return ans
- 1
- 2
- 3
- 4
- 5
- 6