位运算题目

二进制运算的小题目

今天看到牛客网的一些题目,非常经典。解法基本也都很熟悉,所以特地做个总结,后续慢慢补充。
先上题目:
数字中的二进制有多少个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'))

还有很多,有时间慢慢补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值