Ist die Zweierpotenz pro Wort „praktisch“? Wenn ja, warum ist das so?

11

Ich finde mehrere Quellen, die behaupten, dass die Zweierpotenz in einem Binärwort (z. B. 8 Bit pro Byte) eine "gute Sache" oder "praktisch" ist. Ich finde keine Quelle, die darauf hinweist, warum.

Aus Wie ist die Geschichte, warum Bytes acht Bits sind? Wir lesen in der genehmigten Antwort:

Binäre Computer motivieren Designer, Größen mit zwei Potenzen zu erstellen.

OK, aber warum? In der gleichen Frage, aber im Kommentarfeld für die Frage finde ich:

Ist der letzte Satz im Scherz? Ein 12-Bit-Byte wäre unpraktisch, da es keine Potenz von 2 ist. - robjb

Wieder ohne Begründung ...

Adressberechnungen sind mit Zweierpotenzen viel einfacher, und das zählt, wenn Sie aus rohen Transistoren in kleinen Dosen Logik machen - Mike

Da Bytes die kleinste adressierbare Einheit sind, ist dies wenig sinnvoll. Viele positive Stimmen zu dem Kommentar. Vielleicht habe ich etwas verpasst.

Aus Wikipedia :

Der De-facto-Standard von acht Bits ist eine bequeme Zweierpotenz, die die Werte 0 bis 255 für ein Byte zulässt

Und das wäre praktisch, weil ...?

Zur Verdeutlichung handelt es sich hierbei um die Anzahl der Bits pro Byte (z. B. 8 oder 6 usw.), nicht um die Anzahl der Werte pro Byte (z. B. 2 8 oder 2 6 usw.). Aufgrund der Verwirrung weise ich auch darauf hin, dass es nicht um Wortgrößen geht.

Historische Gründe interessieren mich nicht sonderlich. Diese wurden an anderer Stelle gut erklärt (siehe Links).


Verwandte Frage zu SO: /programming/1606827/why-is-number-of-bits-always-a-power-of-two

Andreas
quelle
2
@gnat Ich bin mir ziemlich sicher, dass es sich hier um die Anzahl der Bits pro Byte (dh 8 in einem 8-Bit-Byte) handelt, nicht um die Anzahl der Werte, die ein Byte darstellen kann (dh 2 ^ 8 in einem 8-Bit-Byte). Wenn Sie beispielsweise ein 6-Bit-Byte haben, ist 6 keine Zweierpotenz , aber ja, ein 6-Bit-Byte kann eine Zweierpotenz darstellen.
8bittree
2
@ 8bittree Ich glaube, ich habe es verstanden, danke für die Erklärung! (doppelte Abstimmung zurückgezogen - obwohl ich glaube , es leichter für Leser wäre , wenn eine Erklärung wie in Ihrem letzten Kommentar würde bearbeitet ed in die Frage, dieses Ding eher subtil scheint)
gnat
2
Ähnliche Frage auf SO: stackoverflow.com/q/1606827/3723423 - die Antwort bringt einige plausible Argumente über Bequemlichkeit
Christophe
2
@Snowman: Der Beitrag des OP enthält einen Irrtum "Die Frage stellen": "Warum werden Potenzen von zwei als bequeme Bytegrößen angesehen?" Sie sind nicht. Es hat nichts mit Zweierpotenzen zu tun; er hat den Satz im Wikipedia-Artikel falsch verstanden.
Robert Harvey
3
@RobertHarvey In der Antwort auf "Wie ist die Geschichte, warum Bytes acht Bits sind?" (auch in meiner Frage verlinkt) Es gibt den folgenden Satz: "Binäre Computer motivieren Designer, Größen zu zweit zu machen." Habe ich das auch falsch verstanden? Was bedeuten Ihrer Meinung nach beide Quellen? Nur zu sagen "du hast es falsch verstanden", tut es nicht wirklich für mich.
Andreas

Antworten:

10

Ich glaube nicht, dass 8-Bit-Bytes erfolgreich waren, weil sie eine Breite haben, die eine Zweierpotenz ist. Wenn Sie Bits nicht einzeln ansprechen möchten - und das ist weder jetzt noch in der Vergangenheit üblich -, ist eine Zweierpotenz keine wirkliche praktische Bedeutung (es ist nur - jetzt weit mehr als in der Vergangenheit beim Sparen Einige diskrete Komponenten waren wichtig - ein Reflex für Hardware- und Softwareentwickler und das Bleiben auf vertrauten Grundlagen ist für andere Zwecke wichtig), und ich kann mich nicht erinnern, dass ich dies in meiner Geschichte der Computerablesungen erwähnt habe (1). Man brauchte Kleinbuchstaben, das bedeutete etwas mehr als die damals dominanten 6-Bit-Zeichensätze. ASCII war 7-Bit, aber ASCII war dann allerdings nur für den Austausch gedacht (und somit zur Behandlung in internen Code übersetzt zu werden), und somit

Der Subcommmitee erkennt an, dass es unwahrscheinlich ist, dass Computerhersteller Computer entwerfen, die intern 7-Bit-Codes verwenden. Es ist wahrscheinlicher, dass sie 4-Bit-, 6-Bit- und 8-Bit-Codes verwenden. Gegenwärtig besteht kein weit verbreiteter Bedarf für den Austausch von mehr als 128 getrennten und unterschiedlichen Zeichen zwischen Computern und zwischen Computern und zugehörigen Eingabe- / Ausgabegeräten. [Papierband, das eine natürliche Rahmengröße von 8 Bit hatte, aber eine Parität benötigte, so dass die Nutzlast eines Rahmens 7 Bit betrug, wird auch zugunsten von 7-Bit-Zeichen für ASCII angegeben, die Zweierpotenz wird nicht unter den Vorteilen von 8 Bit angegeben ] (2)

und für die Hardware 8-Bit-Byte gewonnen, weil es erlaubt war, 2 Dezimalstellen in einem Byte zu einem Zeitpunkt zu packen, als 75% der Daten numerisch waren und in BCD dargestellt wurden (3).

(1) zum Beispiel Blaauw und Brooks, Computer Architecture ; MacKenzie, Coded Character Sets, History und Development diskutieren beide zu diesem Thema.

(3) Dokument von X3.2 - dem für ASCII zuständigen Unterausschuss - zitiert von MacKenzie.

(3) Wieder MacKenzie.

Ein Programmierer
quelle
1
Vielen Dank. Ihre Antwort ist genau richtig und Sie haben Referenzen mitgebracht. Du hast meine Stimme. Mir ist jedoch klar, dass es auch unmöglich ist, zu beweisen, wenn das, was Sie sagen, wahr ist. Kann die Nichtexistenz von etwas nicht beweisen. Ich denke, ich sollte wirklich diejenigen befragen, die "Bequemlichkeit" beanspruchen, und ihre Quellen überprüfen. Vielleicht ist es nur ein weit verbreitetes Gerücht.
Andreas
Der andere praktische Faktor ist, dass ein Byte einfach als zwei hexadezimale Werte dargestellt werden kann. Das Einfügen von zwei binär codierten Dezimalstellen (BCD) in ein Byte wird üblicherweise als gepackte Dezimalzahl bezeichnet. Dies wurde in der Tat als zweckmäßig angesehen, da die Dezimalstellen als Dezimalzahl gelesen werden können, wenn Daten hexadezimal angezeigt werden.
JimmyJames
12-Bit-Bytes können einfach als drei Hexadezimalwerte dargestellt werden. Und Sie können drei BCD-Nummern in einem 12-Bit-Byte speichern. Das ist sicherlich viel besser als zwei Hexadezimalwerte und zwei BCD-Zahlen. Tatsächlich kann ein 10-Bit-Byte drei Dezimalstellen enthalten. Und ich denke, so funktioniert der IEEE-Dezimal-Gleitkomma-Standard.
Gnasher729
1
@ JimmyJames, ich denke du bekommst die Kausalität mit hexadezimal umgekehrt. Hexadezimal wurde populär, weil es eine kompakte Art der Darstellung von 8-Bit-Bytes war, zuvor war Oktal weitaus populärer (und es war populärer auf einem Computer wie dem PDP-11, der 8-Bit-Bytes hatte, aber 3-Bit-Felder signifikant waren in der Befehlssatzkodierung).
AProgrammer
@ gnasher729, das 8-Bit-Byte ist ein Kind der 60er Jahre. In den 60er Jahren war es undenkbar, von 6-Bit-Zeichen auf 12-Bit-Zeichen umzusteigen. Selbst heute, wenn wir weit weniger eingeschränkt sind, ist UTF-8 beliebt, weil UTF-16 als zu verschwenderisch angesehen wird. Ein 10-Bit-Byte war ungefähr so ​​undenkbar, und die Codierung von 10 Bit pro 3 Dezimalstellen ist auch völlig unpraktisch, wenn Sie Werte in Registern und im Speicher mit einem Bedienfeld untersuchen, ohne über die Auswirkungen auf die Implementierung mit der Technologie der Zeit zu sprechen.
AProgrammer
2

Abgesehen von einem historischen Unfall gibt es keinen besonderen Grund, warum wir 8/16/32/64 Bit verwenden sollten. Ich nehme an, dass 12/24/48/96 Bit wirklich nützlicher wäre.

Für die Verarbeitung von Text wäre Unicode mit einem hypothetischen UTF-24 billiger als UTF32. Das hypothetische UTF-12 würde alle Einzel- und Doppelbyte-UTF-8-Zeichen in 12 Bit und alle Dreifach- und Vierfachbyte-UTF-8-Zeichen in 24 Bit speichern (der Bereich würde leicht auf 2 ^ 20 Zeichen reduziert, aber das ist immer noch viermal mehr als großzügig genutzt wird); Code wäre einfacher, da es nur zwei Varianten gibt.

Für Gleitkommazahlen reichen normalerweise 48 Bit aus. 96 Bit ist wesentlich besser als 80 Bit erweitert. 24 Bit ist nützlich für Grafiken; viel nützlicher als das 16-Bit, das von einigen Grafikkarten unterstützt wird. 48-Bit-Zeiger können 256 Terabyte verarbeiten.

Der einzige Nachteil sind Bit-Arrays, bei denen eine Division durch 12 erforderlich ist, um die Byte-Positionen zu berechnen. Wenn dies als wichtig erachtet wird, kann die Division durch 12 sicher recht effizient in Hardware implementiert werden.

gnasher729
quelle
Interessanter Punkt über UTF, obwohl er etwas vom Thema abweicht. Die Gleitkomma-Byte- (oder Bit-) Größe ist ein endloser Kampf zwischen Speicher und Präzision, bei dem Sie nur mit dem einen oder anderen leben müssen. Guter Punkt auch über Bit-Arrays.
Andreas
1
Interessante Gedanken, aber ich bin nicht sicher, ob dies die Frage beantwortet.
1
Die Frage war: "Warum wird 8 Bit als praktisch angesehen?" Sicherlich beantwortet "es ist nicht" die Frage.
Gnasher729
1
@ gnasher729 Die Frage war: "Warum wird die Potenz von zwei Bits pro Byte als zweckmäßig angesehen", obwohl Ihre Antwort genauso gut zu gelten scheint.
8bittree
2
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Yannis
2

Dies ist aufgrund gängiger Hardwarearchitekturen mit Vielfachen von 8, z. B. 32-Bit- und 64-Bit-Architekturen, praktisch. Dies bedeutet eine höhere Effizienz bei der Verwendung von 8-Bit-Datenspeicherung und -übertragung.

"Wirtschaftliche Überlegungen im Design drängen jedoch stark auf eine Größe oder sehr wenige Größen, die durch Vielfache oder Brüche (Submultiplikatoren) mit einer Primärgröße in Beziehung stehen. Diese bevorzugte Größe wird zur Wortgröße der Architektur."

Word (Computerarchitektur)

Siehe auch: Wie ist die Geschichte, warum Bytes acht Bits sind?

Brad Thomas
quelle
5
Ich werde dies nicht als Antwort akzeptieren. Meine Frage ist, warum die Zweierpotenz praktisch ist und nicht, warum der Defacto-Standard 8-Bit ist. Und die Geschichte hinter 8-Bit erwähnt, dass 5, 6 und 7 Bits aus echten Gründen verwendet werden, während der Übergang von 7 auf 8 mit einem "meh, warum nicht" motiviert ist. Ich hatte das Gefühl, dass das Lesen verschiedener Quellen Power-of-Two mehr zu bieten hatte als die Kompatibilität mit aktuellen Systemen. (In Wirklichkeit ergab das 8-Bit-Modell eine Parität von 7-Bit-Zeichensätzen.) Word ist eine andere Sache, bei der ich den Vorteil von Zweierpotenzgrößen bekomme, dh, dass bei Berechnungen anstelle von Mult die Verschiebung verwendet werden kann.
Andreas
3
@RobertHarvey Bei dieser Frage geht es nicht um die Anzahl der Zustände pro Switch (dh binär oder trinär oder mehr), sondern darum, wie viele Switches zu gruppieren sind. Siehe meine Bearbeitung der Frage.
8bittree
2
Bei Ihrer Bearbeitung gibt es keine sinnvolle Unterscheidung zwischen der Anzahl der Bits pro Byte und der Anzahl der Werte pro Byte. Es gibt zwei Möglichkeiten, dasselbe auszudrücken. Die Anzahl der Werte, die ein Byte enthalten kann, ergibt sich direkt aus der Anzahl der enthaltenen Bits: Ein Byte hat 8 Bits und kann daher Werte bis zu enthalten 2⁸-1.
Robert Harvey
2
Daraus folgt logischerweise, dass Sie eine Größe für das Byte auswählen, die einen geeigneten numerischen Bereich enthalten kann. ASCII ist 7 Bit, da dies 128 verschiedene Werte liefert, die ausreichen, um beide Fälle des römischen Alphabets, numerische Zeichen, Interpunktion, Steuerzeichen und mehrere Sonderzeichen zu codieren. Ein Byte kann 7 ASCII-Bits und ein Paritätsbit zur Fehlerprüfung für insgesamt 8 Bits enthalten, die für einen Teletyp geeignet sind. Seitdem verwenden wir diese Größe für ein Byte.
Robert Harvey
2
@JeremyKato Die Geräte, die ich erwähnt habe, sind älter (zum größten Teil in den 60er und 80er Jahren), weshalb Sie sie wahrscheinlich nicht kennen. ASCII ist eigentlich eine 7-Bit-Codierung (Parität ist nicht Teil des Standards). Aber für den Hauptteil Ihres Kommentars, nein, ich vermisse nichts. Ich verstehe, dass es Gründe gibt, warum 8 Bit speziell praktisch sind. Was Sie und Robert Harvey vermissen, ist, dass die Frage nach Potenzen von 2 Bit im Allgemeinen und nicht speziell nach 8 Bit gestellt wird.
8bittree
1

Laut Wikipedia-Artikel für Wort erleichtert dies die Berechnung des Adressierungsspeichers erheblich:

Unterschiedliche Speichermengen werden verwendet, um Datenwerte mit unterschiedlicher Genauigkeit zu speichern. Die üblicherweise verwendeten Größen sind normalerweise eine Zweierpotenz der Adressauflösungseinheit (Byte oder Wort). Das Konvertieren des Index eines Elements in einem Array in die Adresse des Elements erfordert dann nur eine Verschiebungsoperation und keine Multiplikation. In einigen Fällen kann diese Beziehung auch die Verwendung von Divisionsoperationen vermeiden. Infolgedessen haben die meisten modernen Computerdesigns Wortgrößen (und andere Operandengrößen), die doppelt so groß sind wie ein Byte.

vartec
quelle
2
Ja, die doppelte Leistung eines Bytes. Es gibt keinen inhärenten Grund, warum ein Byte acht Bits und nicht neun, zwölf oder fünfzehn sein sollte.
Gnasher729
@ gnasher729, viel einfacher durch 8 (oder 16 oder 32 oder 64) zu teilen als durch 9 oder 12 oder 15.
Robert Bristow-Johnson
@ gnasher729 Wenn das Wort eine Potenz von 2 Bits und eine Potenz von 2 Bytes ist, bedeutet dies, dass das Byte eine Potenz von 2 Bits sein muss
vartec
@vartec In Artikel und Zitat heißt es: "Die häufig verwendeten Größen sind normalerweise eine Zweierpotenz der Adressauflösungseinheit (Byte oder Wort)" und "Die meisten modernen Computerdesigns haben Wortgrößen (und andere Operandengrößen), die eine Potenz sind von der doppelten Größe eines Bytes. " Ich habe gelesen, dass "Wortgröße" in Bytes gemessen wird, nicht in Bits. Es gibt keine Regel bezüglich der Wortgröße in Bits, die im Artikel Zweierpotenzen ist oder sein sollte.
Andreas
@vartec: IF. Offensichtlich würde niemand eine Maschine mit 32-Bit-Wörtern und 12-Bit-Bytes bauen. Aber nichts spricht gegen eine Maschine mit 48 oder 96 Bit Wörtern und 12 Bit Bytes. Und es gab Maschinen, auf denen ein Wort zehn Bytes umfasste.
Gnasher729
0

Es ist eng mit dem Adressraum verbunden. Durch Hinzufügen eines Bit mehr zu Ihrem Adressbus können Sie doppelt so viele Speicherplätze adressieren. Wenn Sie diese zusätzliche Zeile hinzufügen, können Sie sie auch in vollem Umfang verwenden.

Dies führt zu einem natürlichen Verlauf von 1, 2, 4, 8, 16, 32 usw.

Auf produktionstechnischer Ebene ist es auch einfach, dasselbe lithografische Muster zu wiederholen. Das heißt, es zu verdoppeln. Wenn Sie mit einem Latch beginnen und dann das Muster verdoppeln, passieren Sie 8, nicht 6, 10 oder 12.

Martin Maat
quelle
1
Wie hängt das mit der Anzahl der Bits in einem Byte zusammen? Behauptest du ernsthaft, dass ein logisches 32-Bit-UND einfacher zu implementieren ist als 36 oder 28 Bit?
Gnasher729
1
Ich habe keinen solchen Anspruch geltend gemacht. Mein Vorschlag ist, dass es aus früheren Designs stammt, die schrittweise erweitert wurden, da Transistoren billiger wurden und ICs kleinere Schaltungen zuließen.
Martin Maat
1
Interessante Theorie zum produktionstechnischen Niveau. Sie könnten auf etwas sein. Könnten Sie den Absatz erweitern oder einen Link bereitstellen, der die Grundlagen erklärt?
Andreas
1
Das ist Unsinn. Beispielsweise wird bei einer Grafikkarte, bei der an verschiedenen Stellen alle Arten von ungeraden Bitgrößen benötigt werden, alles genau mit der erforderlichen Größe ausgeführt und nicht ein bisschen mehr. Wenn ein h.264-Decoder für eine Operation eine Genauigkeit von 19 Bit benötigt, implementiert die Hardware 19 Bit und nicht 20 oder 24 oder 32. Und entschuldigen Sie, Sie manipulieren keine lithografischen Muster. Sie definieren die Hardware und führen sie dann über eine Software aus, die das Layout erstellt.
Gnasher729
1
@MartinMaat: Sie verwechseln Marketing + Standardisierung mit technologischen Gründen. Und Technologie ist das, worüber wir diskutieren.
Gnasher729
0

Wortbreiten sind nicht immer eine Zweierpotenz. Ich habe kürzlich einige Codierungen in einem SHArC-DSP durchgeführt, der eine Wortbreite von 32 Bit für Zahlen hat, jedoch nicht für die Opcodes (die 48 Bit breit sind).

Wahrscheinlich liegt der Grund dafür, dass Wortbreiten eine Zweierpotenz sind, in einigen Anweisungen, die ein einzelnes Bit testen (oder setzen oder löschen oder umschalten) oder um eine bestimmte Anzahl von Bits nach links oder rechts verschieben (oder drehen). Der Opcode enthält ein Bitfeld, um die Position des einzelnen Bits oder die Anzahl der zu verschiebenden Bits anzugeben. Wenn die Wortbreite eine Zweierpotenz ist, benötigt dieses Bitfeld log 2 (word_width) Bits, um das gesamte Wort abzudecken. Das heißt, ein Wort mit einer Breite von 32 Bit benötigt für diese Operationen ein 5-Bit-Feld im Opcode. Wenn das Wort 33 Bit breit wäre, würde es 6 benötigen, sonst könnte es nicht das gesamte Wort abdecken, aber das wäre auch der Fall, wenn das Wort 64 Bit breit wäre.

Bits in einem Opcode sind äußerst wertvoll, daher möchten sie sie normalerweise nicht verschwenden. Dann ist es sinnvoll, das Wort zu einer Potenz von 2 zu machen.

Der Grund, warum Bytes 8 Bit breit sind, ist, dass es die kleinste Zweierpotenz ist, die ein ASCII-Zeichen enthalten kann (dh 7 Bit).

robert bristow-johnson
quelle
Dies ist nicht mein Fachgebiet, aber es klingt nach einem gültigen Grund für die Potenz von zwei Byte UND Wortgrößen. Ich kann mir vorstellen, dass Sie sich auch weniger um UB sorgen müssen. Für eine Verschiebung würden 33 Bit 6-Bit-Opcode erfordern, aber nur etwa die Hälfte der möglichen Werte (0-32) haben eine nützliche Bedeutung. Würdest du zustimmen?
Andreas
Der Opcode muss breiter sein als das Bitfeld, das für die Verschiebungszählung benötigt wird. Ein Byte ist nichts anderes als ein Wort mit 8 Bits. Der Grund, warum Computerhardware dazu neigt , Wortgrößen von 8 oder 16 oder 32 oder 64 Bit zu verwenden (es ist nicht immer der Fall, der alte DSP56000 hatte 24-Bit-Wörter), liegt in den oben genannten Gründen und dem von vartec angegebenen Grund : Wenn Sie eine Bitmap mit gepackten Wörtern erhalten und eine Zeilen- und Spaltennummer eines bestimmten Pixels erhalten, müssen Sie die Spaltennummer durch die Wortbreite teilen, um zu wissen, auf welches Wort zugegriffen werden muss, um das Pixel zu testen oder zu ändern. Das Teilen durch eine Potenz von 2 ist einfach.
Robert Bristow-Johnson
Was ist eine "Bitmap gepackter Wörter"? Passt HighColor zu dieser Beschreibung?
Andreas
@ robertbristow-johnson: Völliger Mangel an Vorstellungskraft. Mit 9-Bit-Bytes würden wir 36-Bit-Wörter verwenden, 130 Millionen Farben anstelle von 16 Millionen Farben in RGBA, RGB666 anstelle von RGB555 oder die Monstrosität RGB565 für Farben von geringer Qualität, und alles wäre in Ordnung. Und ASCII würde 512 Zeichen bis zu Latin Extended enthalten.
Gnasher729
@Andreas, nein, ich meinte zwei "Farben". ganz weiß oder ganz schwarz.
Robert Bristow-Johnson