Czy potęga dwóch bitów na słowo jest „wygodna”? Jeśli tak, to dlaczego?

11

Znajduję kilka źródeł, które twierdzą, że potęga dwóch bitów w słowie binarnym (np. 8 bitów na bajt) jest „dobrą rzeczą” lub „wygodą”. Nie znalazłem źródła, które wskazywałoby dlaczego.

Z Jaka jest historia, dlaczego bajty mają osiem bitów? czytamy w zatwierdzonej odpowiedzi:

Komputery binarne motywują projektantów do tworzenia rozmiarów potęgi dwóch.

Dobrze ale dlaczego? W tym samym pytaniu, ale w polu komentarza do pytania znajduję:

Czy ostatnie zdanie jest żartem? 12-bitowy bajt byłby niewygodny, ponieważ nie jest potęgą 2. - robjb

Ponownie, bez uzasadnienia ...

obliczenia adresów są o wiele prostsze z potęgami 2, a to się liczy, gdy logujesz się z surowych tranzystorów w małych puszkach - Mike

Ponieważ bajty są najmniejszą jednostką adresowalną, nie ma to większego sensu. Jednak wiele komentarzy na temat komentarza. Może coś mi umknęło.

Z Wikipedii :

Faktyczny standard ośmiu bitów to wygodna moc dwóch, pozwalająca na wartości od 0 do 255 dla jednego bajtu

I byłoby to wygodne, ponieważ ...?

Dla wyjaśnienia chodzi o liczbę bitów na bajt (np. 8 lub 6 itd.), A nie liczbę wartości na bajt (np. 2 8 lub 2 6 itd.). Ze względu na zamieszanie zwracam również uwagę, że nie chodzi o rozmiary słów.

Nie jestem zbytnio zainteresowany względami historycznymi. Zostały one dobrze wyjaśnione gdzie indziej (patrz linki).


Podobne pytanie dotyczące SO: /programming/1606827/why-is-number-of-bits-always-a-power-of-two

Andreas
źródło
2
@gnat Jestem pewien, że mówimy tutaj o liczbie bitów na bajt (tj. 8 w 8-bitowym bajcie), a nie o liczbie wartości, które może reprezentować bajt (tj. 2 ^ 8 w 8-bitowym bajcie). Więc jeśli masz na przykład 6-bitowy bajt, 6 nie jest potęgą dwóch , ale tak, 6-bitowy bajt może reprezentować potęgę dwóch liczb.
8bittree
2
@ 8bittree Myślę, że mam, dziękuję za wyjaśnienie! (wycofano duplikat głosowania - choć myślę, że czytelnikom byłoby łatwiej, gdyby wyjaśnienie takie jak w twoim ostatnim komentarzu było edytowane w pytaniu, to wydaje się raczej subtelne)
komnata
2
Podobne pytanie na SO: stackoverflow.com/q/1606827/3723423 - odpowiedź zawiera kilka wiarygodnych argumentów na temat wygody
Christophe
2
@Snowman: Wpis PO zawiera błędne „błagające pytanie”: „Dlaczego moce dwóch są uważane za dogodne rozmiary bajtów?” Nie są. Nie ma to nic wspólnego z potęgami dwóch; źle odczytał zdanie w artykule w Wikipedii.
Robert Harvey,
3
@RobertHarvey W odpowiedzi na pytanie „Jaka jest historia, dlaczego bajty mają osiem bitów?” (również link w moim pytaniu) znajduje się następujące zdanie: „Komputery binarne motywują projektantów do tworzenia rozmiarów potęg dwóch. Czy też to źle przeczytałem? Co Twoim zdaniem oznaczają oba źródła? Samo powiedzenie „źle zrozumiałeś” tak naprawdę nie robi tego dla mnie.
Andreas,

Odpowiedzi:

10

Nie sądzę, by 8-bitowe bajty odniosły sukces, ponieważ mają szerokość, która jest potęgą dwóch. Jeśli nie chcesz zajmować się bitami indywidualnie - a to jest cecha wspólna ani teraz, ani w przeszłości - posiadanie potęgi dwóch nie ma żadnego praktycznego znaczenia (to po prostu - teraz znacznie więcej niż w przeszłości, gdy oszczędzasz ważne były pewne dyskretne komponenty - odruch dla inżynierów sprzętu i oprogramowania i pozostawanie w znajomej ziemi jest ważne dla innych celów), i nie pamiętam, że widziałem o tym w mojej historii odczytów komputerowych (1). Potrzebne były małe litery, co oznaczało coś więcej niż dominujące wówczas 6-bitowe zestawy znaków. ASCII był 7-bitowy, ale ASCII był wtedy traktowany wyłącznie jako wymiana między nimi (i dlatego miał być tłumaczony na wewnętrzny kod do obsługi), a zatem

Podkomitet uznaje, że jest mało prawdopodobne, aby producent komputerów zaprojektował komputery wykorzystujące kody 7-bitowe wewnętrznie. Bardziej prawdopodobne jest użycie kodów 4-bitowych, 6-bitowych i 8-bitowych. Obecnie nie ma powszechnej potrzeby wymiany ponad 128 oddzielnych i odrębnych znaków między komputerami oraz między komputerami i powiązanym sprzętem wejścia / wyjścia. [taśma papierowa, która miała naturalny rozmiar ramki 8 bitów, ale potrzebowała parzystości, więc ładunek ramki wynosił 7 bitów, jest również cytowana na korzyść 7-bitowego znaku dla ASCII, moc dwóch nie jest wymieniana wśród zalet 8 bitów ] (2)

a dla sprzętowego wygranego 8-bitowego bajtu, ponieważ pozwolił on spakować 2 cyfry dziesiętne w jednym bajcie w czasie, gdy 75% danych było liczbowych i reprezentowanych w BCD (3).

(1) na przykład Blaauw i Brooks, Architektura komputerów ; MacKenzie, Zestawy znaków kodowanych, Historia i rozwój prowadzą dyskusję na ten temat.

(3) Dokument X3.2 - podkomitet odpowiedzialny za ASCII - cytowany przez MacKenzie.

(3) Znowu MacKenzie.

AProgrammer
źródło
1
Dziękuję Ci. Twoja odpowiedź jest natychmiastowa i przyniosłeś referencje. Masz mój głos. Zdaję sobie sprawę, że jeśli to, co mówisz, jest prawdą, nie da się tego udowodnić. Nie mogę udowodnić nieistnienia czegoś. Chyba powinienem naprawdę przesłuchać tych, którzy twierdzą, że są „wygodni” i sprawdzić ich źródła. Może to tylko szeroko rozpowszechniona plotka.
Andreas,
Innym czynnikiem sprzyjającym jest to, że bajt może być łatwo reprezentowany jako dwie wartości szesnastkowe. Umieszczenie dwóch cyfr dziesiętnych kodowanych binarnie (BCD) w jednym bajcie jest częściej określane jako upakowany dziesiętny. Uznano to za wygodne, ponieważ ułamki dziesiętne można odczytać jako dziesiętne, gdy dane są wyświetlane w postaci szesnastkowej.
JimmyJames,
12 bajtów bitowych może być łatwo reprezentowanych jako trzy wartości szesnastkowe. I możesz zapisać trzy liczby BCD w 12-bitowym bajcie. Z pewnością jest to o wiele lepsze niż dwie wartości szesnastkowe i dwie liczby BCD. W rzeczywistości 10-bitowy bajt może zawierać trzy cyfry dziesiętne. I myślę, że tak działa standard zmiennoprzecinkowy dziesiętny IEEE.
gnasher729,
1
@JimmyJames, myślę, że odwracasz przyczynowość za pomocą wartości szesnastkowych. Szesnastkowy stał się popularny, ponieważ był kompaktowym sposobem reprezentowania 8-bitowego bajtu, wcześniej ósemkowy był znacznie bardziej popularny (i był bardziej popularny na maszynie takiej jak PDP-11, która miała 8-bitowych bajtów, ale gdzie pola 3-bitowe były znaczące w kodowaniu zestawu instrukcji).
AProgrammer
@ gnasher729, 8-bitowy bajt jest dzieckiem lat 60-tych. Przejście od 6-bitowego char do 12-bitowego char było nie do pomyślenia w latach 60-tych. Nawet dzisiaj, kiedy jesteśmy znacznie mniej ograniczeni, UTF-8 jest popularny, ponieważ UTF-16 jest uważany za zbyt marnotrawny. 10-bitowy bajt był prawie nie do pomyślenia, a kodowanie 10 bitów na 3 cyfry dziesiętne jest również całkowicie niepraktyczne, gdy analizujesz wartości w rejestrach i pamięci za pomocą panelu przedniego, nie mówiąc o wpływie na implementację z technologią czasu.
AProgrammer
2

Poza wypadkiem historycznym nie ma szczególnego powodu, dla którego powinniśmy używać 8/16/32/64 bitów. Przypuszczam, że 12/24/48/96 bit byłby naprawdę bardziej użyteczny.

Do obsługi tekstu Unicode korzystający z hipotetycznego UTF-24 byłby tańszy niż UTF32; hipotetyczny UTF-12 przechowałby wszystkie jedno- i dwubajtowe znaki UTF-8 w 12 bitach oraz wszystkie trzy- i czterobajtowe znaki UTF-8 w 24 bitach (zakres zostałby nieco zmniejszony do 2 ^ 20 znaków, ale to wciąż cztery razy więcej niż jest powszechnie stosowane); kod byłby prostszy, ponieważ istnieją tylko dwa warianty.

W przypadku zmiennoprzecinkowego zwykle wystarcza 48 bitów. 96 bit jest znacznie lepszy niż 80 bit rozszerzony. 24-bit jest przydatny w grafice; znacznie bardziej użyteczny niż 16-bitowy obsługiwany przez niektóre karty graficzne. 48-bitowe wskaźniki mogą obsłużyć 256 terabajtów.

Jedyną wadą są tablice bitów, w których dzielenie przez 12 wymaga obliczenia pozycji bajtów. Jeśli wydaje się to ważne, jestem pewien, że podział na 12 można dość skutecznie zaimplementować w sprzęcie.

gnasher729
źródło
Interesujący punkt na temat UTF, choć jest nieco nie na temat. Rozmiar bajtu zmiennoprzecinkowego (lub bitów) to niekończąca się bitwa między pamięcią a precyzją, w której musisz po prostu żyć z jednym lub drugim. Dobra uwaga na temat tablic bitowych.
Andreas
1
Ciekawe myśli, ale nie jestem pewien, czy to odpowiada na pytanie.
1
Pytanie brzmiało: „Dlaczego osiem bitów uważa się za wygodne”. Na pewno powiedzenie „to nie jest” odpowiada na pytanie.
gnasher729,
1
@ gnasher729 Pytanie brzmiało: „Dlaczego moc dwóch bitów na bajt jest uważana za wygodną”, chociaż wydaje się, że twoja odpowiedź również ma zastosowanie.
8bittree,
2
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
yannis
2

Jest to wygodne ze względu na wspólne architektury sprzętowe wykorzystujące wielokrotności 8, np. Architektury 32-bitową i 64-bitową. Oznacza to wyższą wydajność podczas korzystania z 8-bitowego przechowywania i transmisji danych.

„Jednak względy ekonomicznej konstrukcji silnie przemawiają za jednym rozmiarem lub kilkoma rozmiarami związanymi przez wielokrotności lub ułamki (podwielokrotności) z rozmiarem podstawowym. Ten preferowany rozmiar staje się słowem wielkości architektury”.

Word (architektura komputerowa)

Zobacz także: Jaka jest historia tego, dlaczego bajty mają osiem bitów?

Brad Thomas
źródło
5
Nie zaakceptuję tego jako odpowiedzi. Moje pytanie brzmi: dlaczego potęga dwóch jest wygodna, a nie dlaczego standard defacto jest 8-bitowy. A historia 8-bitowa wymienia 5, 6 i 7 bitów używanych z prawdziwych powodów, podczas gdy przejście z 7 na 8 jest motywowane „meh, dlaczego nie”. Odniosłem wrażenie, że czytając z różnych źródeł potęga dwóch miała więcej niż kompatybilność z obecnymi systemami. (W rzeczywistości 8-bitowe dawało parzystość 7-bitowych zestawów znaków.) Słowo jest inną rzeczą, w której czerpię korzyści z potęgi dwóch rozmiarów, tzn. W obliczeniach można zastosować shift zamiast mult.
Andreas,
3
@RobertHarvey To pytanie nie dotyczy liczby stanów na przełącznik (tj. Binarny vs. trójkowy lub więcej), chodzi o liczbę przełączników do grupowania. Zobacz moją edycję pytania.
8bittree,
2
Jeśli chodzi o edycję, nie ma znaczącego rozróżnienia między liczbą bitów na bajt a liczbą wartości na bajt. Są dwa sposoby wyrażenia tego samego. Liczba wartości, które może przechowywać bajt, wynika bezpośrednio z liczby zawartych w nim bitów: bajt ma 8 bitów, więc może przechowywać wartości do 2⁸-1.
Robert Harvey,
2
Logicznie wynika z tego, że wybierasz rozmiar bajtu, który może zawierać wygodny zakres liczbowy. ASCII ma 7 bitów, ponieważ zapewnia 128 różnych wartości, wystarczających do zakodowania obu przypadków alfabetu łacińskiego, znaków numerycznych, interpunkcji, znaków kontrolnych i kilku znaków specjalnych. Bajt może pomieścić 7 bitów ASCII i jeden bit parzystości do sprawdzania błędów, w sumie 8 bitów, odpowiednich dla typu teletekstu. Od tego czasu używamy tego rozmiaru bajtu.
Robert Harvey,
2
@JeremyKato Urządzenia, o których wspomniałem, są starsze (w większości z lat 60. i 80.) i prawdopodobnie dlatego ich nie znasz. ASCII, w rzeczywistości jest kodowaniem 7-bitowym (parzystość nie jest częścią standardu). Ale w głównej części twojego komentarza, nie, niczego mi nie brakuje. Rozumiem, że istnieją powody, dla których 8 bitów jest szczególnie wygodne, a ty i Robert Harvey brakuje tego, że pytanie dotyczy mocy 2 bitów w ogóle , a nie konkretnie 8 bitów.
8bittree,
1

Według artykułu z Wikipedii słowo to znacznie ułatwia obliczenia związane z adresowaniem pamięci:

Różne ilości pamięci są używane do przechowywania wartości danych z różnym stopniem dokładności. Często używane rozmiary to potęga dwóch wielokrotności jednostki rozdzielczości adresu (bajt lub słowo). Konwersja indeksu elementu w tablicy na adres elementu wymaga wtedy jedynie operacji przesunięcia, a nie mnożenia. W niektórych przypadkach relacja ta może również uniknąć zastosowania operacji podziału. W rezultacie większość współczesnych projektów komputerowych ma rozmiary słów (i inne rozmiary operandów), które są potęgą dwukrotności wielkości bajtu.

vartec
źródło
2
Tak, moc dwa razy większa niż bajt. Nie ma nieodłącznego powodu, dla którego bajt powinien mieć osiem bitów, a nie dziewięć, dwanaście lub piętnaście.
gnasher729
@ gnasher729, o wiele łatwiej jest podzielić przez 8 (lub 16 lub 32 lub 64) niż podzielić przez 9 lub 12 lub 15.
Robert Bristol-Johnson
@ gnasher729, jeśli słowo jest potęgą 2 bitów i potęgą 2 bajtów, oznacza to, że bajt musi być potęgą 2 bitów
vartec 13.08.16
@vartec Artykuł i cytat mówi: „Często używane rozmiary to potęga dwóch wielokrotności jednostki rozdzielczości adresu (bajt lub słowo)” i „większość współczesnych konstrukcji komputerów ma rozmiary słów (i inne rozmiary operandów), które są potęgą dwa razy większej niż bajt. ” Czytam, że „rozmiar słowa” jest mierzony w bajtach, a nie bitach. W artykule nie ma reguły dotyczącej wielkości słowa w bitach, która powinna lub powinna być potęgą-2.
Andreas,
@vartec: IF. Oczywiście nikt nie zbudowałby maszyny z 32-bitowymi słowami i 12-bitowymi bajtami. Ale nic nie przemawia przeciwko maszynie z 48 lub 96 bitowymi słowami i 12 bitami. I były maszyny, w których słowo składało się z dziesięciu bajtów.
gnasher729,
0

Jest ściśle związany z przestrzenią adresową. Dodając jeszcze trochę do swojej magistrali adresowej, możesz adresować dwa razy więcej lokalizacji w pamięci. Więc kiedy dodasz tę dodatkową linię, możesz równie dobrze wykorzystać ją w pełnym zakresie.

Prowadzi to do naturalnego postępu 1, 2, 4, 8, 16, 32 i tak dalej.

Na poziomie technicznym produkcji łatwo jest również powtórzyć ten sam wzór litograficzny. Oznacza to podwojenie. Jeśli zaczniesz od jednego zatrzasku, a następnie podwoisz wzór, miniesz 8, a nie 6, 10 lub 12.

Martin Maat
źródło
1
Jak to się ma do liczby bitów w bajcie? Czy poważnie twierdzisz, że 32-bitowy logiczny AND jest łatwiejszy do wdrożenia niż 36 lub 28 bitów?
gnasher729
1
Nie złożyłem takiego roszczenia. Sugeruję, że wynika to z wcześniejszych konstrukcji, które były stopniowo rozszerzane, ponieważ tranzystory stawały się tańsze, a układy scalone pozwalały na mniejsze obwody.
Martin Maat,
1
Ciekawa teoria o poziomie technicznym produkcji. Możesz być na czymś. Czy możesz rozszerzyć akapit lub podać link wyjaśniający podstawy?
Andreas,
1
To jest nonsens. Na przykład na karcie graficznej, w której w różnych miejscach potrzebne są różnego rodzaju bity nieparzyste, wszystko odbywa się dokładnie z wymaganym rozmiarem, i nie więcej. Jeśli dekoder h.264 potrzebuje pewnej precyzji 19 bitów, to sprzęt implementuje 19 bitów, a nie 20, 24 lub 32. Przepraszam, nie manipulujesz wzorcami litograficznymi. Zdefiniuj sprzęt, a następnie uruchom go za pomocą oprogramowania tworzącego układ.
gnasher729,
1
@MartinMaat: Mylicie marketing + standaryzację z przyczyn technologicznych. A technologia jest tym, o czym rozmawiamy.
gnasher729,
0

Nie zawsze szerokość słowa jest potęgą dwóch. Ostatnio robiłem trochę kodowania w DSP SHArC, który ma 32-bitową szerokość słowa dla liczb, ale nie dla opcodów (które mają szerokość 48 bitów).

Prawdopodobnie powodem, dla którego szerokości słów są potęgą dwóch, są niektóre instrukcje, które testują (lub ustawiają, czyścą lub przełączają) pojedynczy bit lub przesuwają (lub obracają) w lewo lub w prawo o określoną liczbę bitów. W kodzie operacji znajduje się pole bitowe określające lokalizację pojedynczego bitu lub liczbę bitów do przesunięcia. Jeśli szerokość słowa jest potęgą dwóch, to pole bitowe wymaga bitów log 2 (word_width) do pokrycia całego słowa. Oznacza to, że słowo o szerokości 32 bitów potrzebuje 5-bitowego pola w kodzie operacji dla tych operacji. Gdyby słowo miało szerokość 33 bitów, potrzebowałoby 6, w przeciwnym razie nie byłoby w stanie objąć całego słowa, ale byłoby tak również w przypadku, gdyby słowo miało szerokość 64 bitów.

Bity w opcode są niezwykle cenne, więc zwykle nie chcą ich marnować. Wtedy sensowne jest, aby słowo miało moc 2 szerokości.

Powodem, dla którego bajty mają szerokość 8 bitów, jest to, że jest to najmniejsza z dwóch potęg, która może pomieścić znak ASCII (czyli 7 bitów).

Robert Bristol-Johnson
źródło
To nie jest moja specjalizacja, ale brzmi to jak uzasadniony powód mocy dwóch bajtów ORAZ rozmiarów słów. Wyobrażam sobie, że nie musisz się też martwić UB. Dla przesunięcia 33-bitowe wymagałoby 6-bitowego kodu operacji, ale tylko około połowa możliwych wartości (0-32) ma przydatne znaczenie. Zgodziłbyś się?
Andreas
kod operacji musi być szerszy niż pole bitowe potrzebne do zliczenia przesunięcia. bajt to nic innego jak słowo o długości 8 bitów. powodem, dla którego sprzęt komputerowy zwykle używa rozmiarów słów 8 lub 16 lub 32 lub 64 bity (nie zawsze tak jest, stary DSP56000 miał 24-bitowe słowa) wynika z powodów, które podałem powyżej i powodu podanego przez vartec : biorąc pod uwagę bitmapę spakowanych słów i otrzymujesz numer wiersza i kolumny określonego piksela, musisz podzielić numer kolumny przez szerokość słowa, aby wiedzieć, które słowo uzyskać dostęp do przetestowania lub zmiany piksela. dzielenie przez potęgę 2 jest łatwe.
Robert Bristol-Johnnson
Co to jest „bitmapa spakowanych słów”? Czy HighColor pasuje do tego opisu?
Andreas,
@ robertbristow-johnson: Całkowity brak wyobraźni. Przy 9-bitowych bajtach użyjemy 36-bitowych słów, 130 milionów kolorów zamiast 16 milionów kolorów w RGBA, RGB666 zamiast RGB555 lub potworności RGB565 dla kolorów niskiej jakości, i wszystko będzie dobrze. A ASCII będzie zawierać 512 znaków aż do Latin Extended.
gnasher729,
@Andreas, nie, miałem na myśli dwa „kolory”. całkowicie biały lub całkowicie czarny.
Robert Bristol-Johnnson