Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的左移位运算符_Python_C_Bit Shift - Fatal编程技术网

python中的左移位运算符

python中的左移位运算符,python,c,bit-shift,Python,C,Bit Shift,我试图从ip地址扩展前缀len(/y)符号。例如,如果是10.10.10.1/24,那么我需要uint32_t编号4294967040(二进制将是11111111111100000000)作为前缀len(24)。我可以很容易地在C中这样做,如下所示: (gdb) p/t 0xfffffff $11 = 1111111111111111111111111111 (gdb) p/t 0xffffffff << 8 # (since 32-24) $12 = 111111111111111

我试图从ip地址扩展前缀len(/y)符号。例如,如果是10.10.10.1/24,那么我需要uint32_t编号4294967040(二进制将是11111111111100000000)作为前缀len(24)。我可以很容易地在C中这样做,如下所示:

(gdb) p/t 0xfffffff
$11 = 1111111111111111111111111111
(gdb) p/t 0xffffffff << 8 # (since 32-24)
$12 = 11111111111111111111111100000000
(gdb) p (0xffffffff << 8)                                     
$15 = 4294967040
(gdb)p/t 0xfffffff
$11 = 1111111111111111111111111111

(gdb)p/t 0xffffffff它正在工作,尽管没有达到您期望的效果。你从来没有告诉Python你想要一个32位的值,所以你得到的是一个整数;Python支持任意大的整数

>>> ((1<<32) - 1) << 8
1099511627520
>>> 1<<123
10633823966279326983230456482242756608L
>>>((11>十六进制)(0xffffffff>十六进制(ctypes.c_uint32(0xffffffff00).value)
“0xFFFF00L”

您最好继续使用常用的运算符和数字进行计算

>>> a=0xffffffff
>>> (a*256)%(2**32)
4294967040

左移8等于乘以256,将值保持在32位使用的是模2幂32。

在“C”版本中存在整数溢出,当它们被签名时,甚至会导致未定义的行为。这些溢出在Python中不会发生,这就是代码无法工作的原因。
int(bin(…),2)
完全是胡说八道,因为它只是将一个数字转换成二进制的字符串表示形式,然后再转换回来。建议:使用
(2**24-1)
>>> hex((0xffffffff<<8) & 0xffffffff)
'0xffffff00'
>>> hex(ctypes.c_uint32(0xffffffff00).value)
'0xffffff00L'
>>> a=0xffffffff
>>> (a*256)%(2**32)
4294967040