二进制运算的小题目
今天看到牛客网的一些题目,非常经典。解法基本也都很熟悉,所以特地做个总结,后续慢慢补充。
先上题目:
数字中的二进制有多少个1
这里的数字并不关心它的符号,所以即便是负数,只需要得到二进制中1的个数就可以了。但是在python中,对于负数的右移运算,符号位会保留,这样在执行循环语句的右移操作时,首位一直是1会陷入死循环。倘若你不清楚这个细节,那么在下面的代码中就很容易超时。
num = int(input().strip())& 0xFFFFFFFF
def count_one(num):
count = 0
while num:
num = num&(num-1)
count += 1
return count
print(count_one(num))
第一行是读取数值,并将其绝对值化。后面的代码,就是每次将数字num变为num&(num-1),其目的是每次除去最末位的数字1,成功去掉一个,我们的结果就加1,直到数字中没有1,也就是num==0为止。
另外,还有这种解法:
a = int(input())& 0xFFFFFFFF
ww = [(a >> i & 1 ) for i in range(32)]
print(sum(ww))
看起来简洁,事实上需要一个32大小的额外数组,循环也是固定的32次,没有我们上面的解法效率高。
还见到了这种解法,兄弟,你是认真的吗?确定面试官不会给你个白眼。
num = int(input())& 0xFFFFFFFF
num = bin(num)
print(str(num).count('1'))
还有很多,有时间慢慢补充。