Python 二进制常用方法总结

题目要求,查看二进制中1的个数

1. 转换二进制统计

bin转化为二进制

def countBinary(n):
	return bin(n).count('1')

2. 二进制移位

# int val; // input data
ans = 0
while val != 0:
    if val & 1:
    	ans += 1
    val >>= 1
    return ans

代码中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

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值