Jak większość ludzi tutaj wie, używając 4 bitów jesteśmy w stanie policzyć od 0 do 15 (0123456789ABCDEF w systemie szesnastkowym). Ale gdybyśmy policzyli tylko do 9, nadal używalibyśmy 4 bity, a cyfry od A do F byłyby zmarnowane.
Jednak strona z kodem QR Wikipedii stwierdza, że użycie tylko cyfr od 0 do 9 używa 3⅓ bitów na znak, co jest poprawne z statystycznego punktu widzenia. A jednak jedna trzecia bitu nie jest przedmiotem fizycznym, a wysłanie numeru od 0 do 9 wykorzystuje moją wiedzę o co najmniej 4 bitach.
Czy istnieje sposób na wykorzystanie zmarnowanych kombinacji, aby skutecznie wysłać postać z ułamkami bitów?
OK, podaję przykład: Dwie cyfry „27” muszą zostać wysłane. Przy normalnych technikach kodowania wysyłane bity miałyby wartość 00100111. Moglibyśmy wówczas wyobrazić sobie system, który zastąpiłby cyfrę „2” cyfrą „E” lub „F”, w zależności od następnego bitu; w tym przypadku następnym bitem jest 0, więc „2” zastępuje się „E”. Wynikowy ciąg bitów wynosiłby wtedy 1101 0 111. Z drugiej strony, jeśli cyfry „28” muszą zostać wysłane, pierwszy bit po „2” to 1, więc zamiast tego jest zastępowany cyfrą „F”, uzyskując ciąg 1111 1 000.
W obu przypadkach uzyskano oszczędność 1 bitu, ponieważ dla dwóch różnych znaków użyto jednego skrawka. Innymi słowy, trzy i pół bitu są używane na każdym znaku.
(10 * first_digit) + second_digit
i zakodować w 7 bitach, reprezentujących 0 ... 99, z kodami 100-127 pozostałymi dla innych rzeczy. I jeszcze więcej oszczędności dzięki 3 cyfrom skompresowanym do 10 bitów.