将时间打包到位域中
packing time into a bitfield
我需要将当前时间打包成一个限制性位模式。
前5位是小时,后6位是分,后6秒,其余保留
我想到了一个讨厌的 bitAND 掩码,然后在转换回 32 位整数之前进行字符串连接。
这似乎过于复杂且 CPU 昂贵。有没有更高效,更切题,优雅的方法?
怎么样:
wl = 32
hl = 5
ml = 6
sl = 6
word = hours << (wl - hl) | minutes << (wl-hl-ml) | seconds << (wl-hl-ml-sl)
在额外搜索(http://varx.org/wordpress/2016/02/03/bit-fields-in-python/)和我确定的评论之间:
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]
它提供了关联字段的更清晰的结构化设置,尤其是因为它至少每秒被调用一次。已为 Date 和其他位打包向量创建了类似的结构
我需要将当前时间打包成一个限制性位模式。
前5位是小时,后6位是分,后6秒,其余保留
我想到了一个讨厌的 bitAND 掩码,然后在转换回 32 位整数之前进行字符串连接。
这似乎过于复杂且 CPU 昂贵。有没有更高效,更切题,优雅的方法?
怎么样:
wl = 32
hl = 5
ml = 6
sl = 6
word = hours << (wl - hl) | minutes << (wl-hl-ml) | seconds << (wl-hl-ml-sl)
在额外搜索(http://varx.org/wordpress/2016/02/03/bit-fields-in-python/)和我确定的评论之间:
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]
它提供了关联字段的更清晰的结构化设置,尤其是因为它至少每秒被调用一次。已为 Date 和其他位打包向量创建了类似的结构