2017-05-07 1 views
0

Je dois emballer l'heure actuelle dans un bitbit restrictif.temps d'emballage dans un champ de bit

top 5bits est le nombre d'heures, à côté 6 est minutes, 6 secondes qui & le reste sont réservés

Je suis venu avec un masque méchant BITAND puis concaténation de chaîne avant de se convertir de nouveau à un integrer 32bit.

Cela semble trop compliqué & CPU coûteux. Y a-t-il un moyen plus efficace, une méthode élégante?

+0

Pourquoi auriez-vous besoin d'une chaîne pour effectuer des opérations sur les bits? – JohanL

+0

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

+0

@JohanL bien ... mon Le 1er passage était par la méthode bin (x) qui retourne les chaînes, découpant ainsi plusieurs de ces causes beaucoup de chaîne. Le multiple bitshift (comme le montre votre réponse) était mon fallback mais j'espérais quelque chose de plus proche d'une union en Python. – Naib

Répondre

0

Que diriez-vous:

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

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

J'accepte cette réponse car c'était mon moyen de repli si la méthode d'union ne fonctionnait pas – Naib

0

Entre recherches supplémentaires (http://varx.org/wordpress/2016/02/03/bit-fields-in-python/) et un commentaire je me suis installé sur:

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] 

Il offre un cadre structuré plus propre des champs associés, d'autant plus que ce qu'on appelle au moins chaque seconde. Une structure similaire a été créée pour Date et autres vecteurs bitpack