Meine Kollegen und ich haben uns überlegt, warum sich jemand Mühe gibt, Zahlen in einer anderen Basis als Basis 10 zu programmieren.
Ich schlug vor, dass Sie möglicherweise längere Gleichungen optimieren könnten, indem Sie die Variablen in die richtige Basis setzen, mit der Sie arbeiten (zum Beispiel, wenn Sie nur Sätze von 5 von etwas ohne Rest haben, könnten Sie Basis 5 verwenden), aber ich bin nicht sicher wenn das stimmt
Irgendwelche Gedanken?
Antworten:
Der übliche Grund für das Schreiben von Zahlen in einem anderen Code als Basis 10 ist, dass Sie ein bisschen herumspielen.
Um ein Beispiel in C auszuwählen (denn wenn C für irgendetwas gut ist, ist es für Bit-Twiddling gut), sagen wir, dass ein Low-Level-Format eine 2-Bit- und eine 6-Bit-Zahl in einem Byte codiert
xx yyyyyy
:produziert
In einem solchen Fall ist das Schreiben der Konstanten in hexadezimaler Schreibweise weniger verwirrend als das Schreiben in dezimaler Schreibweise, da eine hexadezimale Ziffer genau vier Bits (ein halbes Byte; ein 'Halbbyte') und zwei bis ein Byte entspricht: Die Zahl
0x3f
enthält alle Bits in das niedrige Halbbyte gesetzt, und zwei Bits in das hohe Halbbyte gesetzt.Sie können diese zweite Zeile auch oktal schreiben:
Hier entspricht jede Ziffer einem Block von drei Bits. Einige Leute finden es einfacher, damit zu denken, obwohl ich denke, dass es heutzutage ziemlich selten ist.
quelle
Der Hauptgrund, warum ich verschiedene Basen benutze, ist, wenn ich mich um Bits kümmere.
Es ist viel einfacher zu lesen
als
Oder stellen Sie sich etwas Komplexeres vor
verglichen mit
Hier wird sehr deutlich, was mit den Hex-Beispielen beabsichtigt ist, da Hex im Grunde genommen nur eine kompaktere Form von Binärdaten ist ... Im Gegensatz dazu ist Base-10 (was wir verwenden) nicht annähernd so gut auf Binärdaten abgebildet.
Es gibt auch andere Basen, die Sie in einigen Sprachen verwenden können. Andere Basen als binäre, hexadezimale und dezimale werden Sie kaum gebrauchen. Einige merkwürdige Leute verwenden immer noch oktale, aber das ist ungefähr die esoterischste, die Sie in einem vernünftigen Programm finden werden.
quelle
Wie Sie wahrscheinlich wissen, basieren Computer auf Binärdaten - dies ist Basis 2.
Es ist einfach , zwischen Basis 2 und 4, 8 und 16 (und ähnlichen Vielfachen von 2) zu konvertieren, und diese Übersetzung im Quellcode beizubehalten, kann die Arbeit mit Zahlen erheblich vereinfachen.
Bei Low-Level-Sprachen wie Assembly und C kann dies direkt zu Prozessoroperationen führen (z. B. Bitverschiebung für Division und Multiplikation), was bedeutet, dass die Verwendung dieser Zahlenbasis zu einem viel schnelleren Code führt.
Darüber hinaus sind nicht alle Operationen numerische Operationen - es gibt Bitmaps, bei denen Sie direkt mit den Bits experimentieren müssen - die Verwendung einer Basis 2 oder eines der Vielfachen davon erleichtert die Operationen erheblich.
Wenn Sie mehr erfahren möchten, empfehle ich, Code von Charles Petzold zu lesen .
quelle
Vielleicht, wenn Sie ein Spiel schreiben, das die Wirtschaft einer alten Zivilisation simuliert, die ein Basis-12-System verwendet.
quelle
Außerhalb von hochspezialisierten Programmen ist es ziemlich selten, andere Basen als 10, 16 oder 2 zu verwenden.
Basis 16 (hexadezimal) ist einfach deshalb nützlich, weil der gesamte Bereich eines Bytes (0-255) zweistellig dargestellt werden kann (0x00-0xFF), was die Arbeit mit rohen Hex-Dumps oder Binärdaten erheblich vereinfacht. Hexadezimal ist auch nützlich, wenn Bitmasken mit bitweisen Operatoren verwendet werden, da die zweistellige Entsprechung zu einem Byte die Lesbarkeit verbessert.
Seltener kann Base 2 (binär) auch mit bitweisen Operationen verwendet werden, aber viele Programmiersprachen unterstützen keine Base-2-Literale, und hexadezimal ist ohnehin viel präziser und lesbarer.
Base-8 (oktal) wird manchmal auch aufgrund von UNIX-Dateiberechtigungen verwendet. Abgesehen davon ist es ziemlich selten, andere Basen als 10 außerhalb hochspezialisierter mathematischer Kontexte zu verwenden.
quelle
Der häufigste gültige Grund für die Verwendung anderer Basen liegt in der einfachen Konvertierung in die Basis 2: Es ist trivial, eine Zahl zur Basis 8 oder zur Basis 16 ohne Verwendung eines Taschenrechners in eine Binärzahl umzuwandeln, indem eine kurze Tabelle mit acht oder sechzehn gespeichert wird zahlen:
Dies eröffnet mehrere Möglichkeiten:
0xFF00FF
es sich um Magenta (Rot + Blau) handelt. Die Aufgabe ist viel schwieriger, wenn Sie mit präsentiert werden16711935
quelle
Der Computer (oder genauer gesagt der Compiler) kümmert sich überhaupt nicht darum, welche Zahlenbasis Sie in Ihrem Quellcode verwenden. Die am häufigsten verwendeten Programmiersprachen unterstützen die Basen 8 (oktal), 10 (dezimal) und 16 (hexadezimal) direkt. Einige bieten auch direkte Unterstützung für Basis-2-Zahlen (Binärzahlen). Spezialisierte Sprachen können auch andere Nummernbasen unterstützen. (Mit "direkt unterstützen" meine ich, dass sie die Eingabe von Ziffern in diese Basis erlauben, ohne auf mathematische Tricks wie Bitverschiebung, Multiplikation, Division usw. im Quellcode selbst zurückzugreifen. Zum Beispiel unterstützt C Base-16 direkt mit seiner
0x
Zahlenpräfix und der reguläre hexadezimale Ziffernsatz 0123456789ABCDEF. Solche Tricks können nützlich sein, um die Nummer im Kontext verständlicher zu machen, aber solange Sie dieselbe Nummer ohne sie ausdrücken können, ist dies - oder auch nicht - nur eine Annehmlichkeit.)Am Ende ist das jedoch belanglos. Angenommen, Sie haben eine Aussage wie die folgende:
Es ist beabsichtigt, eine Ganzzahlvariable zu erstellen und diese mit der Dezimalzahl 10 zu initialisieren. Was sieht der Computer?
Der Compiler tokenisiert dies und stellt fest, dass Sie eine Variable vom Typ
int
mit dem Namen deklarierenn
, und weist ihr einen Anfangswert zu. Aber was ist das für ein Wert?Für den Computer lautet die Eingabe für den Anfangswert der Variablen, wobei Probleme mit der Byte-Reihenfolge und Ausrichtung ignoriert werden
0x31 0x30
. Bedeutet dies, dass der Anfangswert 0x3130 ist (12592 in Basis 10)? Natürlich nicht. Der Sprachparser muss die Datei weiterhin in der verwendeten Zeichenkodierung lesen, damit sie1
0
gefolgt von einem Anweisungsabschlusszeichen gelesen werden kann. Da in dieser Sprache die Basis 10 angenommen wird, lautet diese (rückwärts) "0 Einsen, 1 Zehner, Ende". Das heißt, ein Wert von 10 Dezimalstellen.Wenn wir einen hexadezimalen Wert angegeben haben und unsere Sprache verwendet,
0x
um anzugeben, dass der folgende Wert hexadezimal ist, erhalten wir Folgendes:Der Compiler sieht
0x
(0x30 0x78) und erkennt dies als Basis-16-Präfix. Er sucht daher nach einer gültigen Basis-16-Nummer, die darauf folgt. Bis zum Abschluss der Anweisung wird gelesen10
. Dies bedeutet 0 "Einsen", 1 "Sechzehn", was 16 in Basis 10 ergibt. Oder 00010000 in Basis 2. Oder aber Sie möchten es darstellen.In beiden Fällen reserviert der Compiler, der Einfachheit halber ohne Optimierungen, genügend Speicher, um den Wert einer Typvariablen zu speichern
int
, und platziert dort den Wert, den er aus dem Quellcode gelesen hat, in eine Art temporäre Speichervariable . Es schreibt dann (wahrscheinlich viel später) die resultierenden Binärwerte in die Objektcodedatei.Wie Sie sehen, spielt es keine Rolle, wie Sie numerische Werte in den Quellcode schreiben. Dies kann sich nur geringfügig auf die Kompilierungszeiten auswirken, aber ich würde mir vorstellen, dass (auch hier ignoriert man Optimierungen wie das Zwischenspeichern von Festplatten durch das Betriebssystem) Dinge wie zufällige Turbulenzen um die sich drehenden Platten, Zugriffszeiten auf Festplatten und Datenbuskollisionen auftreten usw. haben eine viel größere Wirkung.
Fazit: Mach dir keine Sorgen. Schreiben Sie Zahlen in eine Basis, die von der Programmiersprache Ihrer Wahl unterstützt wird und die sinnvoll ist, wie die Nummer verwendet und / oder gelesen wird. Sie haben viel mehr Zeit damit verbracht, diese Antwort zu lesen, als Sie jemals in Kompilierungszeiten erholen würden, wenn Sie klug darüber sind, welche Zahlenbasis im Quellcode verwendet werden soll. ;)
quelle
Hier sind einige Gründe, die noch nicht aufgetaucht sind ...
x00 - Einige Betriebssysteme und Hardware-Geräte-APIs erwarten, dass die Argumente hexadezimal / binär sind. Wenn Sie für solche APIs codieren, ist es einfacher, die Zahlen in demselben Format zu verwenden, das die API erwartet, als sie zwischen verschiedenen Basen zu konvertieren. Zum Beispiel, um ein Nachrichtenende-Byte an einen Server zu senden oder um eine Nachricht zu senden, um eine Verbindung zu einem Kommunikationskanal zu trennen.
x01 - Möglicherweise möchten Sie, dass Ihre Anwendung Zeichen darstellt, die auf bestimmten Tastaturen nicht verfügbar sind, z. B. das Copyright-Zeichen (\ u00a9).
x02 - Damit einige Konstanten / Literale (visuell) in verschiedenen Kultureinstellungen beibehalten werden, insbesondere, wenn der Quellcode / die Quelldateien zwischen Entwicklern mit verschiedenen lokalen Einstellungen verschoben werden.
x03 - Damit ihr Code verwirrend und komplex aussieht - Gut, dass C # keine Oktalkonstanten unterstützt!
quelle
Das Hauptproblem besteht darin, ein einzelnes Wort von Computergröße auf vernünftige Weise darzustellen. Der 6502 war ein 8-Bit-Prozessor. Der 4004 war ein 4-Bit-Prozessor.
Beim Umgang mit einer 4 oder 8 Bit Nummer klappt das ganz gut. Eine 4-Bit-Zahl ist ein einzelnes Hexadezimalzeichen. Eine 8-Bit-Zahl (ein Byte) besteht aus zwei Hexadezimalstellen. Systeme, die eine Potenz von 2 Wörtern haben, sind heutzutage der übliche Standard - 16 Bit, 32 Bit, 64 Bit. Alle diese Werte werden zur hexadezimalen Darstellung durch 4 geteilt.
Oktal (Basis 8) wurde in Systemen verwendet, in denen die Wortgröße 12, 24 oder 36 war. Der PDP8, IBM Mainframe und ICL 1900 der alten Tage verwendeten diese. Diese Wörter ließen sich leichter mit Oktetten darstellen als mit einem begrenzten hexadezimalen Bereich (ja, sie teilen sich auch in 4).
Anscheinend gab es auch eine Kostenersparnis bei der Verwendung der Nummerierung zur Basis 8. Bei der Darstellung von 12 Bits in BCD kann die erste Ziffer nur 0-4 sein, die zweite, dritte und vierte jedoch 0-9. Wenn dies als Hex durchgeführt wurde, hat man 3 Hex-Zeichen, aber jeder hat 16 mögliche Werte. Es war billiger, eine Nixie-Röhre herzustellen , die nur 0-7 als 0-9 (mit zusätzlicher Logik für BCD) oder 0-F für Hexadezimal hatte.
Man sieht Octal noch heute mit Unix-Dateiberechtigungen (755, 644), wobei Eigentümer, Gruppe und Welt jeweils 3 Bits haben, die die Berechtigungen darstellen.
In der Welt der Mathematik macht man gelegentlich seltsame Dinge mit unterschiedlichen Grundlagen. Zum Beispiel eine schwache Goodstein-Sequenz aus dem Projekt euler 396 ... oder etwas Einfacheres mit palindromischen Zahlen . Es gibt die Eigenschaft einer Zahl in der Basis N, dass eine Zahl, die ein Vielfaches von N - 1 ist, ihre Ziffern zu einem Vielfachen von N - 1 summiert . Wenn N - 1 ein perfektes Quadrat ist, gibt es diese Eigenschaft auch für sqrt ( N - 1 ). Dies hat einige Anwendungen in bestimmten mathematischen Problemen.
quelle
In der Finanzbranche gibt es ein Identifizierungsschema, das effektiv die Basis 36 bildet . Es verwendet die Ziffern 0-9 und die Buchstaben BZ, um Ziffern mit einem Wert von 0-35 darzustellen. Es werden die Vokale übersprungen, um zu verhindern, dass schädliche Namen generiert werden.
Es ist jedoch nicht perfekt. Es gab eine Zeit, in der eine unglückliche Firma den Ausweis hatte
B000BZ
.quelle
Grund Nr. 1: Alle Nummern auf der Schaltungsebene werden in Basis 2 dargestellt (elektrischer Schalter ist ein- oder ausgeschaltet). Grund Nr. 2: Da die Bits auf einer Ebene höher als die tatsächlichen Schaltkreise in Bytes gruppiert sind und Bytes leicht als zwei hexadezimale Ziffern dargestellt werden können, wenn 3 Dezimalstellen (und eine gewisse Validierung) erforderlich wären, um alle möglichen Werte der zu repräsentieren Byte.
Wenn Sie also auf diesen Ebenen arbeiten (oder sie in einer verwalteten Umgebung approximieren), ist es einfacher, binär oder hexadezimal als dezimal zu arbeiten. Die Situationen, in denen Sie dies tun würden, sind unterschiedlich, in der Regel jedoch nie, in denen Sie nur Grundrechenarten benötigen.
quelle
Ein Bereich, in dem sehr häufig Basis-16-Zahlen (Hexadezimalzahlen) verwendet werden, ist die Farbangabe, insbesondere bei Verwendung von HTML / CSS für das Web. Die Farben, die wir auf Digitalanzeigen verwenden, werden anhand einer Kombination von 3 Intensitätswerten für 3 "Basis" -Farben (RGB - Rot, Grün, Blau) angegeben, die miteinander gemischt werden, um eine der 16 Millionen darstellbaren Farben (unter Verwendung von 24-Bit-Farben) zu erstellen ).
Zum Beispiel wäre grün in voller Intensität in hex
0x00ff00
und65280
in dezimal. Stellen Sie sich nun vor, Sie würden versuchen, eine Farbe in Ihrem Kopf "manuell" zu mischen, die zu gleichen Teilen aus Rot und Blau besteht, etwa mit halber Intensität, um ein schönes Lila0x800080
zu erhalten8388736
. Beim Arbeiten mit Graustufen wird es noch einfacher - 50% Grau sind0x808080
(hex) und8421504
(dezimal), 75% sind0xC0C0C0
und12632256
und und.Die Verwendung von hex ist viel intuitiver, und jeder, der mit dieser Verwendung von Farbe vertraut ist, kann die Farbe sofort "erraten", indem er nur den hex-Wert betrachtet. Es ist auch viel weniger fehleranfällig, wenn Sie dieselbe Farbe mehrmals verwenden müssen (was normalerweise der Fall ist).
Überprüfen Sie jede Webseite (und insbesondere das CSS) auf verrückte Hex-Nutzung: D
HINWEIS: In CSS werden die Hexadezimalwerte mit einem
#
Präfix geschrieben, z. B .:#00ff00
für Grün, und manchmal auch auf nur drei Ziffern gekürzt, z. B.#0f0
für Grün.quelle
Für einige Algorithmen ist Basis 2 sinnvoller als alles andere. Möchten Sie beispielsweise lieber eine Funktion schreiben, um einen binären Baum oder einen 10-arigen Baum zu durchlaufen?
Häufiger wird jedoch die Basis 2 verwendet, da Computer auf diese Weise ihre Zahlen fast universell darstellen. Das bedeutet, dass:
Es gibt auch immer die seltene Anwendung, die von Natur aus eine ungerade Basis erfordert, die weder 2 noch 10 sein kann.
quelle
2
Figur, die du benutzt?Es ist ehrlich gesagt eine Vorliebe, wenn Sie aus irgendeinem Grund Polydaktylie haben und 11 Finger haben oder gerne mit Ihren Zehen zählen, damit Sie gerne in Basis 20 arbeiten, liegt es ganz bei Ihnen. Beachten Sie jedoch, dass bei einem Universalitätsthema, das die meisten von uns täglich mit Bits und Bytes zu tun haben, wirklich ein Häkchen gesetzt ist, wenn wir in Basis 19 etwas finden, das Bitmanipulationen ausführt.
GRÜNDE FÜR BASE x
Basis 10 - Modell all unserer Sachen, weil wir 10 Zählziffern haben (Füße sind komisch und stinken, also verwenden wir diese nicht).
Basis 2 - Computer verwenden dies für Bits (Ein / Aus). Dies bezieht sich auf lesbare Spannungspegel, die von Gattern / Transistoren / Kondensatoren übertragen werden.
Basis 8 - Alt, damals, als die Computer nicht besonders groß waren (oder damals, als sie platzmäßig waren), war dies für irgendetwas gut (ich mag es kein bisschen)
Basis 16 - Gut zum Anzeigen der oberen und unteren Halbbytes für die Bitmanipulation. Dies ist in der Embedded / FPGA / Hardware-Welt sehr nützlich.
NORMALE BASEN IN COMPUTERN
Je nach Vorliebe könnte ich Ihnen genau sagen, wie "ein" eine Farbe in einem hexadezimalen RGB-Wert ist, der mir gegeben wurde. Dies kann folglich in einem einzelnen int in der Hardware dargestellt und dann mit einigen Verschiebungen an mich zurückgegeben werden Einfach, 1 komplexe Farbe = 1 Datenpunkt, der sich gut für die Verarbeitung großer Bilder mit begrenztem Speicher eignet. Vergleicht man das mit einer Basis 10-Darstellung, könnte man sie alle addieren und in einer Zahl speichern, aber welche Zahl ist welche, oder vielleicht ist R die Zeit 10000, G ist 100 und B ist sein eigener Raum, das ist eine Menge mathematischer Operationen Normalerweise kosten Multiplikationen mehr Zyklen als eine Schicht, sodass Ihr nächstes Datenstück bereits in der Warteschlange steht, bevor Sie mit der Verarbeitung Ihres letzten Stücks fertig sind.
Manchmal ist es einfach besser, in der Basis 2, 8 oder 16 zu arbeiten. Bei den meisten Maschinen ist das Multiplizieren mit 2 nur eine kleine Verschiebung, diese sind sehr schnell, genauso wie das Teilen durch 2.
Um die Idee des Bit Twiddling noch weiter zu erläutern. Bei der Arbeit in einer eingebetteten Umgebung musste ich häufig auf eine Reihe von Anzeigen, Schaltern oder anderen Registerkennungen zugreifen.
In diesem Fall wäre das Zuweisen eines ganzen Zeichens, Bytes oder Int zu jedem Schalter ineffizient und albern. Ein Schalter oder eine Leuchte hat zwei Positionen (ein und aus). Warum sollte ich etwas zuweisen, das bis zu 256 Positionen hat, oder 2 ^ 16? Positionen usw. Jedes Licht in einem Array könnte 1 Bit sein, das 8 oder 16 oder 32 oder 64 oder 128 (Breite Ihres Datentyps) auf ein einzelnes Wort / Register passt. Die Raumeffizienz ist gefragt und eher erwünscht.
Die Verwendung von Elementen, die bei der Programmierung auf Basis von 2 ^ n erstellt wurden, beispielsweise für die Verarbeitung von RGB-Daten und vielen Signaldaten (GPS, Audio, ASCII usw.), ist in hexadezimaler, binärer und oktaler Form viel einfacher, da dies in der Maschine und auf diese Weise dargestellt wird Erkennen Sie leichter, was präsentiert wird und wie man es manipuliert.
SELTSAME BASEN VERWENDEN
Es gibt keine Effizienz, wenn Sie nicht dafür programmieren. Wenn Sie Basis 11 wollen, müssen Sie einen Datentyp dafür einrichten und alle Operatoren überladen, um die Darstellung für den Benutzer zu handhaben. Ich sehe keinen Grund, warum ein System mit 5 Elementen und immer nur einem Vielfachen von 5 Elementen in die Fünf-Elemente-Mathematik umgewandelt werden müsste. Außerdem sollten Sie besser beten, dass jeder, der sich dazu entschlossen hat, seinen Code für Basis 271 zu schreiben, ihn gut dokumentiert, oder dass Sie mehr Zeit damit verbringen, ihn zu verstehen, als es sich für die Erstellung von Basis 271 lohnt, da alle Elemente ein Vielfaches von 271 sind.
quelle
Früher hatten wir eine Reihe von Displays, auf denen die Ziffern 0-9 angezeigt werden konnten, aber wir hatten noch keinen AF.
http://ad7zj.net/kd7lmo/images/ground_nixie_front.jpg ist ein solches Beispiel ...
Oktal passt wirklich gut auf diese Displays und war einfacher als binär oder dezimal.
quelle
Ich bin überrascht, dass alle anderen Antworten nicht zwei sehr häufige Verwendungen beim Rechnen für alternative Basen erwähnt haben:
Komprimierung : Oft ist es wünschenswert, eine Binär-, Dezimal- oder Hexadezimalzahl auf einer größeren Basis darzustellen, um die Darstellung zu verkürzen. Zum Beispiel machen das alle Bit-Shortenger wie bit.ly. Oder Sie tun dies, um eine GUID für die Verwendung in einer URL zu kürzen.
quelle