Python 将时间打包到位字段中

Python 将时间打包到位字段中,python,bit-fields,Python,Bit Fields,我需要将当前时间打包成限制性的位模式 前5位是小时,后6位是分钟,后6位是秒&其余的保留 我提出了一个讨厌的位掩码,然后在转换回32位整数之前进行字符串串联 这看起来太复杂了&CPU太贵了。有没有更有效、更切题、更优雅的方法 那么: wl = 32 hl = 5 ml = 6 sl = 6 word = hours << (wl - hl) | minutes << (wl-hl-ml) | seconds << (wl-hl-ml-sl) wl=32 h

我需要将当前时间打包成限制性的位模式

前5位是小时,后6位是分钟,后6位是秒&其余的保留

我提出了一个讨厌的位掩码,然后在转换回32位整数之前进行字符串串联

这看起来太复杂了&CPU太贵了。有没有更有效、更切题、更优雅的方法

那么:

wl = 32
hl = 5
ml = 6
sl = 6

word = hours << (wl - hl) | minutes << (wl-hl-ml) | seconds << (wl-hl-ml-sl)
wl=32
hl=5
ml=6
sl=6

额外搜索()和我确定的评论之间的word=hours:

class TimeBits(ctypes.LittleEndianStructure):
    _fields_ = [
            ("padding", ctypes.c_uint32,15), # 6bits out of 32
            ("seconds", ctypes.c_uint32,6), # 6bits out of 32
            ("minutes", ctypes.c_uint32,6), # 6bits out of 32
            ("hours", ctypes.c_uint32,5), # 5bits out of 32
            ]

class PacketTime(ctypes.Union):
    _fields_ = [("bits", TimeBits),
            ("binary_data",ctypes.c_uint32)
            ]


packtime = PacketTime()
now = datetime.today().timetuple()
packtime.bits.hours = now[3]
packtime.bits.minutes = now[4]
packtime.bits.seconds = now[5]

它为相关字段提供了更清晰的结构化设置,尤其是至少每秒调用一次。已经为日期和其他位打包向量创建了类似的结构

为什么需要字符串来执行位操作?还有@JohanL-well。。。我的第一个过程是通过bin(x)方法返回字符串,因此对其中的多个进行切片会导致大量字符串。多重位移位(如您的回答所示)是我的退路,但我希望Python中有更接近于联合的东西。@handle我在发布之后,实际上遇到了另一个提倡ctypes的网站。你的评论有助于澄清itI的各个方面。如果union方法不起作用,我会接受这个答案,因为这是我的退路