Используйте сдвиг и побитовое ИЛИ, затем преобразуйте в символ, чтобы получить «байт»:
x = chr(a | (b << 1) | (c << 2) | (d << 5))
Чтобы снова распаковать этот байт, сначала преобразуйте в целое число, затем сдвиньте и используйте побитовое И:
i = ord(x)
a = i & 1
b = (i >> 1) & 1
c = (i >> 2) & 7
d = (i >> 5) & 7
Объяснение: Изначально у вас есть
0000000a
0000000b
00000ccc
00000ddd
Сдвиг влево дает вам
0000000a
000000b0
000ccc00
ddd00000
Побитовое ИЛИ приводит к
dddcccba
Преобразование в символ преобразует это в один байт.
Распаковка: четыре различных сдвига вправо приводят к
dddcccba
0dddcccb
00dddccc
00000ddd
Маскированию (побитовое И) с 1
(0b00000001
) или 7
(0b00000111
) приводит к
0000000a
0000000b
00000ccc
00000ddd
снова.