Python 中补码表示

《剑指offer》中有一道题:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

如果不是负数很好解决,用到如下技巧即可

n = n & (n-1)
即可把一个二进制数(此处的n)中最后一个1去掉。
过程如下: 比如 n = 3的时候,一般数都是用32位补码表示,此处为了解释上述公式,没有扩展为32位。
当 n = 3时候 其二进制为 0b11
n & (n-1) => 0b11 & 0b10 = 0b10所以去掉了原数字(n)中的最后一位1
所以代码可以写成如下格式:
def mian(n):
	count = 0
	while n:
		count += 1
		n = n & (n-1)
	return count

但是这只是针对n为正数的情况下,如果n为负数, 就会出错,因为n-1已经不是上述过程分析的那样了。

然而python的补码表示跟C/C++不一样
如
>>>bin(-2) 
>>>'-0b10'
没有32位之分
因此所以要变成32位补码的形式,只需如下处理(补码表示如下,负数的补码为 其原码去反加1, 符号位为1)
如 -2
原码:0000 0000 0000 0000 0000 0000 0000 0010
补码:1111 1111 1111 1111 1111 1111 1111 1110
只需要执行 n = n & 0xffffffff
即可得到n的补码表示
>>>bin(-2 & 0xfffffff)
>>>'0b11111111111111111111111111111110'
所以上述代码添加如下行即可
def mian(n):
	count = 0
	# if n < 0
	if n < 0:
		n = n & 0xffffffff
	while n:
		count += 1
		n = n & (n-1)
	return count
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值