python 中的左移运算符
Left shift operator in python
我正在尝试从 ip 地址扩展 prefix-len(/y) 表示法。例如,如果 10.10.10.1/24 那么我需要 uint32_t 个 4294967040(二进制将是 11111111111111111111111100000000)作为 prefix-len(24)。我可以在 C 中轻松地执行此操作,如下所示:
(gdb) p/t 0xfffffff
= 1111111111111111111111111111
(gdb) p/t 0xffffffff << 8 # (since 32-24)
= 11111111111111111111111100000000
(gdb) p (0xffffffff << 8)
= 4294967040
但我在 python 中尝试了同样的方法,但它不起作用。我是 python 的新手,所以请向我解释为什么它不起作用以及什么是正确的解决方案。(而且我知道有很多 modules/packages 可以为我做这个,但我不想使用它们)
>>> bin(0xffffffff)
'0b11111111111111111111111111111111'
>>> bin(0xffffffff << 8)
'0b1111111111111111111111111111111100000000'
>>> int(bin(0xffffffff << 8),2)
1099511627520
>>>
它正在运行,尽管没有达到您的预期。你从来没有告诉 Python 你想要一个 32 位的值,所以你得到一个整数; Python 支持任意大的整数。
>>> ((1<<32) - 1) << 8
1099511627520
>>> 1<<123
10633823966279326983230456482242756608L
您期望的行为是默默地丢弃溢出,这是 C 由于历史原因而具有的行为。然而,即使在 C 语言中,它也不是一定会按照您的预期执行; int 可能是 16、64 或 18 位宽。当您需要已知尺寸时,还有更具体的类型,例如 uint32_t。要在 Python 中执行类似的截断,要么存储在大小受限的类型中(如数组条目或 ctypes.c_uint32),要么显式屏蔽。
>>> hex((0xffffffff<<8) & 0xffffffff)
'0xffffff00'
>>> hex(ctypes.c_uint32(0xffffffff00).value)
'0xffffff00L'
你最好继续用常用的运算符和数字进行计算。
>>> a=0xffffffff
>>> (a*256)%(2**32)
4294967040
左移 8 是乘以 256,保持 32 位的值是使用值模 2 的 32 次方。
我正在尝试从 ip 地址扩展 prefix-len(/y) 表示法。例如,如果 10.10.10.1/24 那么我需要 uint32_t 个 4294967040(二进制将是 11111111111111111111111100000000)作为 prefix-len(24)。我可以在 C 中轻松地执行此操作,如下所示:
(gdb) p/t 0xfffffff
= 1111111111111111111111111111
(gdb) p/t 0xffffffff << 8 # (since 32-24)
= 11111111111111111111111100000000
(gdb) p (0xffffffff << 8)
= 4294967040
但我在 python 中尝试了同样的方法,但它不起作用。我是 python 的新手,所以请向我解释为什么它不起作用以及什么是正确的解决方案。(而且我知道有很多 modules/packages 可以为我做这个,但我不想使用它们)
>>> bin(0xffffffff)
'0b11111111111111111111111111111111'
>>> bin(0xffffffff << 8)
'0b1111111111111111111111111111111100000000'
>>> int(bin(0xffffffff << 8),2)
1099511627520
>>>
它正在运行,尽管没有达到您的预期。你从来没有告诉 Python 你想要一个 32 位的值,所以你得到一个整数; Python 支持任意大的整数。
>>> ((1<<32) - 1) << 8
1099511627520
>>> 1<<123
10633823966279326983230456482242756608L
您期望的行为是默默地丢弃溢出,这是 C 由于历史原因而具有的行为。然而,即使在 C 语言中,它也不是一定会按照您的预期执行; int 可能是 16、64 或 18 位宽。当您需要已知尺寸时,还有更具体的类型,例如 uint32_t。要在 Python 中执行类似的截断,要么存储在大小受限的类型中(如数组条目或 ctypes.c_uint32),要么显式屏蔽。
>>> hex((0xffffffff<<8) & 0xffffffff)
'0xffffff00'
>>> hex(ctypes.c_uint32(0xffffffff00).value)
'0xffffff00L'
你最好继续用常用的运算符和数字进行计算。
>>> a=0xffffffff
>>> (a*256)%(2**32)
4294967040
左移 8 是乘以 256,保持 32 位的值是使用值模 2 的 32 次方。