Sia x
che y
mantengono valori interi, devi solo scegliere di usare 0b
valori letterali binari per definirli.
Se vuoi combinare i due in z
, puoi farlo facilmente utilizzando una operazione di spostamento e operazioni bit a bit binari :
>>> x = 0b00010101010
>>> y = 0b1110000
>>> z = (x << 7) | y
>>> bin(z)
'0b101010101110000'
Si noti che python non traccia quanti bit 'precisione' si desidera mantenere su tali valori; hai definito y
con 7 bit di informazioni, quindi ho dovuto spostare x
a sinistra 7 volte per fare spazio a y
. Dovresti tenere traccia di queste informazioni da solo.
Il tuo prossimo problema è rappresentare i dati come base64 in quanto questo formato richiede di fornirli solo con i byte. Sono pezzi di 8 bit di dati binari. Ciò significa che dovrai allineare i tuoi bit ai limiti di 8 bit e quindi trasformarli in byte (ad esempio stringhe). Non potrò aggirare questo, temo.
Utilizzerei il % modulo distruct
per questo, ti consente di comprimere interi e altri dati- digita in byte con facilità:
>>> import struct
>>> struct.pack('>H', x)
'\x00\xaa'
>>> struct.pack('>H', x).encode('base64')
'AKo=\n'
Nell'esempio precedente ho impacchettato la variabile x
a 11 bit come un corto senza segno (usando il formato C standard little-endian), ottenendo 2 byte di informazioni, quindi codificato in base64.
Il contrario richiede quindi la decodifica da base64, quindi un'operazione di decompressione:
>>> foo = struct.unpack('>H', 'AKo=\n'.decode('base64'))[0]
>>> bin(foo)
'0b10101010'
Ancora una volta, Python non tiene traccia di quanti bit di informazioni sono importanti per te, dovrai tenerne traccia in modo esplicito.