2

如何获得 32 位 int 的前 11 位ctypes

import ctypes

class Fields(ctypes.Structure):
    _pack_ = 1
    _fields_ = [('a', ctypes.c_uint, 11)]

class BitField(ctypes.Union):
    _pack_ = 1
    _fields_ = [('b', Fields),
                ('raw', ctypes.c_uint)]

bf = BitField()
bf.raw = 0b01010000001000000000000000000001

print('0b{:0>32b}'.format(bf.raw))
print('0b{:0>32b}'.format(bf.b.a))

结果:

0b01010000001000000000000000000001
0b00000000000000000000000000000001

而我想要

0b 01010000001 000000000000000000001
0b000000000000000000000 01010000001
4

2 回答 2

2

位域实现差异很大。如果要从整数中提取特定位(而不是与 C 库的互操作struct),最好完全避免使用 ctypes 并使用按位运算:

raw = 0b01010000001000000000000000000001
a = raw >> (32 - 11)
于 2013-10-23T12:43:04.780 回答
2

另一种选择可能是使用

class Fields(ctypes.Structure):
    _pack_ = 1
    _fields_ = [('x', ctypes.c_uint, 21), ('a', ctypes.c_uint, 11)]
于 2013-10-23T12:44:40.577 回答