【Python】Python中对于整数的存储

本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出


Python中负数的存储

因为Python中是不区分int、long数据类型的,且数字运算本身就是大整型运算,也就是说,在Python中,正数例如5的二进制表示为000000000......0101,而负数例如-3的二进制表示为11111111111......1111101,也就是会有无限个0和1,在对负数的表示上与Java/C++有所不同,这里可以使用一道例题来讲解:

题目描述

给定一个数字,这个数字在32位整数范围内,现在要求这个数字的二进制表示中1的个数

相关分析

Java

import java.util.*;

class Main{

	static int hammingWeight(int x){
		int cnt = 0;
		while(x != 0){
			cnt += 1;
			x -= (x&-x);
		}
		return cnt;
	}

	public static void main(String[] args){
		System.out.println(hammingWeight(3)); // 2
		System.out.println(hammingWeight(-3)); // 31
	}
}

Python

def hammingWeight(x:int):
	cnt = 0
	while x:
		cnt += 1
		x -= (x&-x)
	return cnt

if __name__ == '__main__':
	print(hammingWeight(3)) # 2
	print(hammingWeight(-3)) # 死循环

如果使用Java/C++来做,无论正数还是负数,由于他们第32位之后的数字都为0,所以并不会陷入死循环,但是如果使用Python来做的话,相同的代码,当求解负数的时候,就会陷入死循环,这也就印证了上面所说的负数的表示方式,由此可见,在负数的二进制表示方面,Python与Java/C++是有所不同的,所以在一些问题还有平常代码的书写上需要格外注意!

解决方案

那么一般涉及到Python位运算的方案应该如何解决呢,其实很简单,只需要让Python表示的数字与0xffffffff做与操作就好了,这样就可以获取到Python表示的数字中低32位的所有数字,剩下的操作就和Java/C++是一样的了,对于上面的Python解题代码的修改如下:

def hammingWeight(x:int):
	x = x&0xffffffff
	cnt = 0
	while x:
		cnt += 1
		x -= (x&-x)
	return cnt

if __name__ == '__main__':
	print(hammingWeight(3)) # 2
	print(hammingWeight(-3)) # 31
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值