Yarım bit kullanmanın bir yolu var mı?


19

Buradaki çoğu insanın bildiği gibi, 4 bit kullanarak, 0'dan 15'e kadar sayabiliriz (0123456789ABCDEF onaltılık). Ancak sadece 9'a kadar sayacak olsaydık, hala 4 bit kullanırdık ve A'dan F'ye kadar olan rakamlar boşa gidecekti.

Bununla birlikte, Wikipedia'nın QR-Code sayfası , 0'dan 9'a kadar yalnızca sayısal rakamlar kullanmanın, karakter başına 3⅓ bit kullandığını ve bu da istatistiksel bir açıdan doğru olduğunu belirtir. Ve yine de biraz üçte biri fiziksel bir nesne değil ve 0'dan 9'a kadar bir sayı göndermek bilgime en az 4 bit kullanıyor.

Boşa giden kombinasyonları, bit kesirleri olan bir karakteri etkili bir şekilde göndermek için kullanmanın bir yolu var mı?

Tamam, bir örnek vereyim: İki rakam "27" gönderilmelidir. Normal kodlama tekniklerinde, gönderilen bitler 00100111 olur. Bir sonraki bite bağlı olarak, '2' rakamını 'E' veya 'F' rakamıyla değiştirecek bir sistem hayal edebiliriz; bu durumda bir sonraki bit 0 olur, '2' yerine 'E' olur. Sonuçta elde edilen bit dizisi 1101 0 111 olur. Öte yandan "28" rakamlarının gönderilmesi gerekiyorsa, "2" den sonraki ilk bit 1 olur, onun yerine "F" rakamı ile değiştirilir, dize 1111 gr 1 000.

Her iki durumda da, 1 bitlik bir ekonomi etkilendi, çünkü iki farklı karakter için bir kırıntı kullanıldı. Başka bir deyişle, her karakterde üç buçuk bit kullanılır.


2
Değerleri daha küçük bir basamak alanında paketleme hakkında farklı bir bakış açısı için, Üçlü bilgisayarlara ( en.wikipedia.org/wiki/Ternary_computer ) göz atın .
RLH

3
(10 * first_digit) + second_digit0-99'u temsil eden ve diğer şeyler için 100-127 kodları kalan 7 bit olarak hesaplayıp kodlayabileceğinizi tanımak daha iyidir. Ve 10 bite sıkıştırılmış 3 basamakla daha da fazla tasarruf var.
Hot Licks

100 farklı değerin tümünü ayrı ayrı göndermek için, alabileceğiniz en iyi şey 7 bite paketlemektir. Daha fazla rakamınız varsa, ambalaj daha verimli olacaktır.
Gönderilecek

Yanıtlar:


22

Yarım bit gönderemezsiniz, ancak iletim veya depolamadan önce bir bitte iki yarım bit etkili bir şekilde paketleyebilirsiniz.

Kendiniz bir örnek veriyorsunuz, böylece kendi sorunuzu YES ile etkili bir şekilde cevapladınız.

Belki biraz daha kolay bir yol, iki ondalık basamağın değerini 7 bitte basitçe kodlamaktır. (İkili kodlu ikili ondalık sayı dizisi).


1
Rakam çiftlerini yedi bite paketlemek için güzel bir kullanım örneği, çoğunlukla sayısal verilerden oluşan ASCII dosyalarını iletirken. 128'in altındaki herhangi bir bayt değeri tek bir ASCII karakterini temsil ederken, 128-227 iki ASCII basamağını temsil eder. Kodlaması veya kod çözmesi kolaydır ve verilerin çoğunlukla rakam (veya herhangi bir rakam) içermesini gerektirmez, ancak rakam dizelerini% 50 kolayca sıkıştırabilir.
supercat

Veya 3 alfanümerik karakteri bir bit yedekli 16 bit halinde paketleyen PDP11 formatı ...
Brian Drummond

@BrianDrummond: Biri 40'lık bir setten tam olarak üç karakter veya 39'luk bir setten en fazla üç karakter depolamak için 16 bit kullanabilir, ancak yedek bir bit olmaz. Normalde "alfasayısal" en az 36'lık bir set anlamına gelir, ancak yedek bitin tek yolu set 32 ​​ile sınırlı olsaydı olurdu.
supercat

Ben 5 bit / char olduğunu düşündüm. Alfasayısal iki kod kümesine bölünmüştür ve bir sembol "anahtar kodu ayarlanmıştır" için ayrılmıştır. Yanılmışım : en.wikipedia.org/wiki/DEC_Radix-50 Gerçi yeterince garip, sadece bir gece birisinin bana 8 "diskette, sadece bir loşlukta, bir CP / M sisteminde verdiği bir raporun kodunu çözmek zorunda kaldığımda gördüm Z80 asmının hatırlanması
Brian Drummond

19

Huffman kodlamasını kullanarak sayılar değişen bit uzunluğunda olabilir. diğerlerinden daha sık ortaya çıkacak bir rakamı biliyorsanız, yardımcı olacaktır.

örnek (eşit sıklıkta):

0-1111

1-1110

2-110

3-101

4-100

5-011

6-010

7 - 001

8 - 000

1 sayısını almak için alıcı son örneği:

İlk bit gelir ve seçenek olarak sadece 0 ila 4 bırakır.

ikinci bit gelir ve seçenek olarak sadece 0 ila 2 bırakır.

üçüncü bit gelir ve seçenek olarak 0 ila 1 bırakır.

dördüncü bit geliyor ve gelen sayı 1


12

Belki de aradığınız şey, her biri prensipte kesirli (tamsayı olmayan) sayıda bit gerektirebilecek bir dizi sembolleri verimli bir şekilde kodlayabilen Aritmetik Kodlama'dır. (ancak toplam mesajın tam bir bit sayısı olması gerekir)

Wikipedia alıntısı :

Aritmetik kodlama, girdiyi bileşen sembollerine ayırmak ve her birini bir kodla değiştirmek yerine Huffman kodlaması gibi diğer entropi kodlama biçimlerinden farklıdır, aritmetik kodlama tüm mesajı tek bir sayıya dönüştürür; buradaki (0.0 ≤ n < 1.0).


10

Kayan noktalı aritmetik için yeni IEEE P754 artık ikiliye ek olarak ondalık biçimleri de tanımlamaktadır. Kodlamalardan biri dijital rakamları 3'e 10 bit halinde gruplamayı önerir.

10 bit = 1024 olası kod kullanarak 0 ile 999 arasında kodlama yapmak oldukça verimlidir ve ondalık basamaklar genellikle yine de üçe ayrılır.

Yoğun Paketlenmiş Ondalık : http://en.wikipedia.org/wiki/Densely_packed_decimal


Ondalık basamaklar üçe göre gruplandırılsa bile, doğru ondalık kayan nokta semantiği (1) on kişiyi üçten fazla olmayan bir güçle bir mantisin ölçeklendirilmesini gerektirebilir; (2) (bitler mod 3) 'e bağlı olarak sayının üst veya alt kısmı için bazı bitler kullanılabilir; (3) Üs baz-1000'de saklanıyorsa, üç basamaklı alt grubun bazen en yakın birim yerine en yakın 10 veya en yakın 100'e yuvarlanması gerekebilir.
supercat

Şahsen BigDecimal, her kelime 32 bit yerine 9 ondalık basamak içeriyorsa , pek çok amaç için türlerin daha verimli olacağına inanıyorum , ancak yuvarlama davranışları basamak gruplamasından etkilenmemelidir.
supercat

4

İkili (veya Onaltılık) 1: 1 yazışmaları, bitler için kodlayan bir simgedir. Yani evet, gösterdiğiniz gibi mümkün. Bunun kullanıldığı bir başka yer de (ama biraz farklı bir şekilde), bit geçişlerinin kod çözmeyi kolaylaştırmak için daha uzak tutulduğu iletişim sistemlerinde kafes kodlama / kod çözme işlemidir. Ve elbette 8b / 10b ve 64b / 66b vb. Kodlama benzer bir fikirdir, burada daha küçük bir sembol alanı, alt bantlarda DC dengesi, sembol ayırma ve kontrol kodları elde etmek için biraz fazla geniş bir alanda kodlanır.


4

Veri gösterimi, sizin veya programınızın ona verdiği yoruma bağlıdır.

'27' yi ASCII karakterleri olarak da gönderebiliriz, örneğin 0x3237 = 0b0011001000110111.

xn(x)günlük2n(x)

x1,x2n(x1),n(x2)günlük2n(x1)+günlük2n(x2)günlük2(n(x1)n(x2))

2günlük2(10)=24=8günlük2(1010)=7

Her zaman uygulamaya bağlıdır, ancak normalde önerdiğiniz gibi değişkenleri 'birleştirdiğiniz' zaman, bu değişkenler üzerinde işlem yapmak istiyorsanız daha fazla hesaplama gücüne mal olacaktır. 'Birleştirilen' değişkenlere ekleme ve çıkarma işlemleri normalden daha karmaşıktır ve donanımda daha fazla alan gerektirebilir veya daha uzun gecikmelere neden olabilir.


...


2

Değerleri paketlemenin olağan yolu, her bir değeri kendi aralıklarıyla çarpmaktır, böylece bitlerle verimli bir şekilde temsil edebileceğiniz büyük bir sayı elde edersiniz. Paketi açarken aralığa böldüğünüzde, kalan rakam rakamdır ve sonuç kalan paketlenmiş rakamlardır.

0 ila 2 aralığında 5 değeriniz varsa, her değer için 2 bit kullanmanın naif yolu tarafından kullanılan 10 bit yerine 8 bit (değerleri temsil etmek için en az 7.92 bite ihtiyacınız vardır), yaparak (((n 1 * 3 + n 2 ) * 3 + n 3 ) * 3 + n 4 ) * 3 + n 5


Bu kodlama yöntemi için bir ad var mı?
Keegan Jay

1

Teorik olarak, yüksek empedanslı dedektör için devre alanı ve güç harcamak istiyorsanız, dijital bir kabloya (1, 0 ve yüksek Z) 3 durum gönderebilirsiniz. Yasal Uyarı: Bu simülatörde harika çalışıyor. Devrenin pratik olmayan bazı problemleri olup olmadığını bilmiyorum, örneğin normal bir çift kapı kadar hızlı geçiş yapamıyor.

Yüksek Z'den sinyale (sinyalin genellikle silikonda topraklandığı) bir sinyal geçişi için normal terim yarım bitlik bir sinyaldir.


1

3⅓ bite ihtiyaç duyan bir ondalık basamak göndermek istiyorsunuz. Ancak 4 bit kullanmanız gerekecek, çünkü üçte birini gönderemezsiniz.

Yani, 3⅓ bitin gerçekte ne anlama geldiğini bulmak için, her biri 3⅓ bitlik iki (veya üç) basamağa ihtiyacınız vardır. Her biri 3⅓ bitten biraz daha azını gerektiren 0 ile 9 arasında 2 (3) ondalık basamak göndermek istiyorsanız, bunu 7 (10) bit kullanarak yapabilirsiniz. Yapıcı kanıt kolaydır:

7 (10) bit, 0 ile 128 (1023) arasındaki bir sayıyı kodlamanıza izin verir - ancak yalnızca iki (üç) ondalık basamağın olası kodlamaları olan 00 (000) ila 99 (999) gerekir. QED


1

Bağlantılı wiki makalesinde ne anlama geldiğini yanlış anladığınızı düşünüyorum. Ne kastedilmektedir (boşluk, virgül veya süreler hariç) tamamen sayısal karakter dizesi için ideal sıkıştırma kullanırken, 3 kullanarak her bir karakteri temsil edebilir olmasıdır 1 / 3 bit ortalama . Aslında, bundan biraz daha iyi, çünkü matematik uzun vadede log 2 (10) = 3.3219 bit / karakter alabileceğinizi söylüyor .

Benzer şekilde, alfasayısal artı bazı semboller (yalnızca büyük harf ve 9 sembol) veya 45 karakter kümesi için, makalede 5.5'e yuvarlanmış günlük 2 (45) = 5.4918 bit / karaktere ihtiyacınız vardır .

İndirgenmiş bitler / karakter, önceden ayarlanmış bir kodlama veya QR standardı tarafından belirtilen bir sıkıştırma şeması ile sıkıştırma kullanılarak elde edilir (hangisinin kullanıldığından emin değilim). Bir karakterin kodlanması için gereken ortalama bit sayısını temsil eder, böylece tek bir karakter az ya da çok bit kullanılarak kodlanır. Ayrıca, yukarıda listelenen değerlerin sonsuz, rastgele dizeler için ideal değerler olduğunu unutmayın. Özel hazırlanmış dizeler için daha iyi veya daha kötü sıkıştırma oranları elde etmek mümkündür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.