2017-05-07 18 views
0

我需要將當前時間打包到限制位模式。打包時間到位字段

頂部5bits是小時,接下來的6是分鐘,接下來的6秒&其餘轉換回32位integrer之前被保留

我想出了一個討厭BITAND掩模,然後字符串連接。

這看起來過於複雜& CPU昂貴。有沒有更高效的&更重要的一點,優雅的方法?

+0

爲什麼你需要一個字符串來執行位操作? – JohanL

+0

https://docs.python.org/3/library/struct.html和http://stackoverflow.com/questions/142812/does-python-have-a-bitfield-type – handle

+0

@JohanL好吧......我的第一次傳遞是通過返回字符串的bin(x)方法,從而將多個這樣的字符串切分爲多個字符串。多重位移(正如你的答案所示)是我的後備,但我希望有更接近Python的聯盟。 – Naib

回答

0

如何:

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

word = hours << (wl - hl) | minutes << (wl-hl-ml) | seconds << (wl-hl-ml-sl) 
+0

我會接受此答案,因爲如果聯合方法不起作用 – Naib

0

額外的搜索(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和其他bitpacking矢量創建了類似的結構