Время упаковки в поле битов

Мне нужно упаковать текущее время в ограничительный битовый шаблон.

верхние 5 бит - это часы, следующие 6 - минуты, следующие 6 секунд, а остальные зарезервированы

Я придумал противную маску bitAND, а затем конкатенацию строк перед тем, как вернуться к 32-битному интегратору.

Это кажется слишком запутанным и дорогим процессором. Есть ли более эффективный и более точный, элегантный метод?

2 ответа

Решение

Как насчет:

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 и других векторов битовой упаковки

Другие вопросы по тегам