如何使用Python检查一个数字是否为32位整数?

16
在我的程序中,我正在查看一个字符串,并希望知道它是否表示为一个32位整数。
当前,我首先使用isdigit()检查它是否是数字,然后检查它是否超过了2^32的值(假设我不关心无符号值)。
如何最好地检查我的输入字符串是否包含有效的32位整数?

哈哈...是的,它可以...但这是一种有效的方式吗?还是有更好的方法? - user1020069
1
你能否发布你的准确代码,这样我们就可以看到实现了吗? - Dogbert
我可能会使用位运算符。 - Some programmer dude
8个回答

6

4

另一个想法是,看看这个值是否可以以4字节的方式打包:

>>> from struct import pack, error
>>> def test_32bit(n):
...     try:
...             pack("i", n)
...     except error:
...             return False
...     return True
... 

如果使用无符号值,请使用pack("I", n)

1
不要使用裸的 except 子句,因为它可能会捕获不应在此处捕获的 KeyboardInterrupt 等内容。 - Abe Karplus
@AbeKarplus 我知道,但我只是有点懒 :) - Kimvais

4
假设最大的32位整数是0xffffffff
那么我们需要检查我们的数字是否比这个值大:
abs(n) <= 0xffffffff

在数字周围包裹abs()将处理负数情况。


5
正负极限不相同,分别为-2^31和2^31-1。 - anishtain4
4
有符号整数的十六进制值为 0x7FFFFFFF - dain

3
我们可以使用左移运算符来执行检查。
def check_32_bit(n):
    return n<1<<31

不错的回答。可能更易懂的变体:n<2**31 - user1717828
这个答案的一些解释会非常有帮助! - Mahesh Jamdade

3

对于无符号值,这将起作用:

>>> def is32(n):
...     try:
...         bitstring=bin(n)
...     except (TypeError, ValueError):
...         return False
...         
...     if len(bin(n)[2:]) <=32:
...         return True
...     else:
...         return False    
... 
>>> is32(2**32)
False
>>> is32(2**32-1)
True
>>> is32('abc')
False

为什么我不能只检查它是否在上限和下限值的范围内? - user1020069
使用 try 和二进制,您可以验证 n 是否为有效数字。顺便检查一下位数是否少于 32 位。这样就可以全天候地工作了... - dawg
这很酷,但是isDigit不是已经检查了它是否是有效的数字吗? - user1020069
我正在使用 str.isDigit() 方法作为预筛选,以检查它是否是一个数字表示,然后将其强制转换为整数表示,并检查它是否超出范围!!! - user1020069
@user1020069:那也可能行。按照我写的方式,Python会为您执行数学计算。如果您正在检查一个字符串,它将在有效数字is32(2**31)中出现问题,因为该字符串包含“**”。这只是更多的步骤。根据上下文使用适当的方法。 - dawg
显示剩余2条评论

3
>>> def is_int32(number):
...     try:
...         return not(int(number)>>32)
...     except ValueError:
...         return False

6
这对负数无效:>>> is_int32(-1):False - Elliott Beach

2
简单的解决方案将会像这样。
if abs(number) < 2**31 and number != 2**31 - 1:
   return True
else:
   return False

如果我们的数字在[-2^31, 2^31 - 1]范围内,我们就可以继续进行。

0
>>> def is_32_bit(n: int) -> bool:
...     if n in range(-2 ** 31, (2**31) - 1):
...         return True
...     return False
... 
>>> is_32_bit(9999999999)
False
>>> is_32_bit(1)
True

1
这是错误的。检查你的范围。2**32 应该是 (2**31)-1 - Wai Ha Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接