Warum sollten Sie beim Programmieren andere Basisnummern verwenden?


35

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?


6
Haben Sie ein konkretes Beispiel, das diese Frage aufgeworfen hat? Dinge, die zur Basis 2 oder zur Basis 16 gehören, haben offensichtlich ihre Vorteile, da es für einen Computer einfacher ist, sie zu verstehen.
KDiTraglia

4
Was bedeutet "Programmieren von Zahlen in Basis ..."? Da sind Zahlen. Zeitraum. Sie sind in einer Basis intern vertreten, aber das spielt meistens keine Rolle und ändert keine arithmetischen Regeln.

12
@JMD - Bitte arbeiten Sie mit den Moderatoren zusammen, um einen Ihrer beiden Cross-Postings zu entfernen und einen hier in P.SE zu platzieren. Cross-Posting über Websites hinweg ist verpönt. Die Mods können stattdessen Fragen für Sie migrieren.

10
@JMD - Crossposting ist immer noch nichts, was Sie tun sollten. Bei Bedarf wird ein Migrationsprozess für solche Fragen durchgeführt .
Oded

2
@JMD Post nicht kreuzen, eine Frage, die für mehr als eine Site geeignet ist, ist äußerst selten. Diesmal war Ihre Frage zum Thema Stapelüberlauf nicht relevant. Aber selbst wenn Ihre Frage für beide Sites geeignet war, wird das Einkaufen Ihrer Frage um Sites im Allgemeinen verpönt. Wir alle erbieten unsere Zeit freiwillig hier. Sie hätten zumindest eine Weile warten können, um die Antworten zu bewerten, die Sie beim Stapelüberlauf erhalten haben, bevor Sie eine Querveröffentlichung durchführen.
Yannis

Antworten:


59

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:

main() {
    unsigned char codevalue = 0x94; // 10 010100
    printf("x=%d, y=%d\n", (codevalue & 0xc0) >> 6, (codevalue & 0x3f));
}

produziert

x=2, y=20

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 0x3fenthä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:

printf("x=%d, y=%d\n", (codevalue & 0300) >> 6, (codevalue & 077));

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.


Ein anderes Beispiel könnte die Verwendung der "magischen Zahl" 0xDEADBEEF sein. Siehe diesen Beitrag stackoverflow.com/questions/5907614/0xdeadbeef-vs-null
Etsitpab Nioliv

45

Der Hauptgrund, warum ich verschiedene Basen benutze, ist, wenn ich mich um Bits kümmere.

Es ist viel einfacher zu lesen

int mask=0xFF;
byte bottom_byte = value & mask;

als

int mask=255;
byte bottom_byte = value & mask;

Oder stellen Sie sich etwas Komplexeres vor

int mask=0xFF00FF00;
int top_bytes_by_word = value & mask;

verglichen mit

int mask=4278255360; //can you say magic number!? 
int top_bytes_by_word = value & mask;

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.

0xFF = b11111111 = 255
0xFFFF = b1111111111111111 = 65536
0xF0F0 = b1111000011110000 = 61680

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.


2
Oktal ist überhaupt nicht selten, 0 ist oktal :) (habe gesehen, dass es irgendwo im Stack Exchange-Netzwerk nicht gefunden werden kann).
Gerrit

2
@Earlz: Leute mit vielen Fingern. :-)
Bryan Oakley

3
26 x 2 + 10 = Alle Groß- und Kleinbuchstaben sowie alle Zahlen. Nicht wirklich so ungewöhnlich. Ich habe auch Base 36 verwendet, bei der es sich nur um die Version handelt, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.
Darrel Hoffman

3
@vasile: Es gibt 60 Minuten in einer Stunde und 60 Sekunden in einer Minute, weil die Leute Base-60-Systeme verwendeten, nicht umgekehrt. Ich hoffe, Sie glauben nicht, dass etwas in der Natur besagt, dass es 60 Minuten in einer Stunde geben muss!
Joren

1
ja, sie lasen es in den sternen und benutzten base-60 zur zeitmessung. Mit 360 Tagen (= 6x60) pro Jahr ist es nicht so verrückt, die Zeit in der Basis 60 zu messen.
ytg

8

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 .


3
Der Compiler spielt keine Rolle. Während es in der Tat einfacher ist, zwischen den Basen zu konvertieren, die Sie auflisten, ist eine einfache (langsame) Konvertierung für Base 10 auch nicht schwierig, und die meisten Sprachen, die für die Compilerkonstruktion nützlich sind (dafür verwenden Sie keine Assembly), haben dies Die Konvertierung ist in der Standardbibliothek verfügbar und daher für Compiler kostenlos.

1
Die Verwendung von Hexadezimal in C führt nicht zu schnelleren Programmen. Dem Compiler ist es egal, welche Basis Sie verwenden.
Charles Salvia

5
Egal auf welcher Basis das Programm geschrieben ist, der Compiler übersetzt es zur Kompilierungszeit in eine Binärdatei. Die Montageanleitung ist identisch.
Karl Bielefeldt

2
Unternehmenscomputer basieren in der Tat auf einem dreifachen Bool: wahr, falsch und "Datei nicht gefunden"
Martin Beckett


4

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.


Octal wird oft verwendet, um Zeichenwerte anzugeben und manchmal um Binärdaten zu sichern.
Caleb

3

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:

 0000 0     0001 1     0010 2     0011 3
 0100 4     0101 5     0110 6     0111 7

 1000 8     1001 9     1010 A     1011 B
 1100 C     1101 D     1110 E     1111 F

Dies eröffnet mehrere Möglichkeiten:

  • Wenn eine Zahl eine Zusammensetzung aussagekräftiger Binärzahlen darstellt, können Sie die einzelnen Komponenten ohne Computer bestimmen. Wenn beispielsweise eine 24-Bit-Zahl eine Farbe in RGB darstellt, ist es trivial zu sagen, dass 0xFF00FFes sich um Magenta (Rot + Blau) handelt. Die Aufgabe ist viel schwieriger, wenn Sie mit präsentiert werden16711935
  • Wenn eine Zahl eine Bitmaske darstellt, ist es praktischer, sie als kompakte Hex-Zahl aufzuschreiben, als eine viel längere Binärzahl
  • Bestimmte Architekturen haben sich sehr bemüht, den Binärcode als Oktalzahl lesbar zu machen. PDP-11 war ein solches System: Mit dem höchstwertigen Bit können Sie 8-Bit-Operationen von 16-Bit-Operationen unterscheiden. In den letzten beiden Oktalgruppen können Sie die beiden an der Operation beteiligten Register usw. angeben. Ich kannte mehrere Leute, die PDP-11-Binärcode ohne Disassembler vom Bildschirm lesen konnten, aber sie brauchten den Maschinencode, um ihn in einem Oktalsystem zu drucken.

2

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 seiner0xZahlenprä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:

int n = 10;

Es ist beabsichtigt, eine Ganzzahlvariable zu erstellen und diese mit der Dezimalzahl 10 zu initialisieren. Was sieht der Computer?

i  n  t     n     =     1  0  ;
69 6e 74 20 6e 20 3d 20 31 30 3b (ASCII, hex)

Der Compiler tokenisiert dies und stellt fest, dass Sie eine Variable vom Typ intmit dem Namen deklarieren n, 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 sie 1 0gefolgt 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, 0xum anzugeben, dass der folgende Wert hexadezimal ist, erhalten wir Folgendes:

i  n  t     n     =     0  x  1  0  ;
69 6e 74 20 6e 20 3d 20 30 78 31 30 3b (ASCII, hex)

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 gelesen 10. 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. ;)


1

warum sich jemand Mühe geben würde, Zahlen in einer anderen Basis als Basis 10 zu programmieren.

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!


1

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.


1
Oktal war, weil der PDP 9/18-Bit-Bytes hatte, eine Oktalzahl 3-Bit darstellt. Wenn Sie also Byte durch 3 teilbar sind, ist dies sehr sinnvoll
Martin Beckett

1
Octal wurde auch auf einigen 16-Bit-Systemen verwendet (insbesondere auf dem PDP-11), da sich 15 - die Anzahl der Bits außer dem Vorzeichen-Bit - in 3 aufteilt. Es wurde allgemein unter dem ursprünglichen UNIX-Betriebssystem verwendet (z. B. "od" ist das Standardwerkzeug zum Sichern von Binärdateien. Das Standardformat ist nicht nur für Berechtigungen, sondern 16-Bit-Oktal (statt 8-Bit-Hex). Es kann auch relevant sein, dass der PDP-11-Befehlssatz zwei 6-Bit-Operandenfelder hatte.
Random832

Oktal wurde auch verwendet, weil es zu der Zeit auf der Technologie angezeigt werden konnte. Nexi-Röhren? Oder andere 0-9 Displays? Es dauerte eine Weile, bis AF-Anzeigen angezeigt wurden.
Jeremy J Starcher

1

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.


1

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.


1

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 0x00ff00und 65280in 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 Lila 0x800080zu erhalten 8388736. Beim Arbeiten mit Graustufen wird es noch einfacher - 50% Grau sind 0x808080(hex) und 8421504(dezimal), 75% sind 0xC0C0C0und 12632256und 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 .: #00ff00für Grün, und manchmal auch auf nur drei Ziffern gekürzt, z. B. #0f0für Grün.


0

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:

  • Viele Operationen sind in Basis 2 effizienter:
    • Multiplikations-, Divisions- und Modulo-Potenzen von 2 sind viel schneller als die allgemeine Division
    • Flags und kleine Werte können effizienter als Binärziffern einer größeren Zahl gespeichert, abgerufen und bearbeitet werden.
  • Operationen, die Datendateien und Netzwerkdatenströme lesen, schreiben und bearbeiten, müssen direkt damit umgehen, dass sie als Binärzahlen dargestellt werden.

Es gibt auch immer die seltene Anwendung, die von Natur aus eine ungerade Basis erfordert, die weder 2 noch 10 sein kann.


2
Natürlich würde ich einen 10-jährigen Baum verwenden. Was ist das für eine komische 2Figur, die du benutzt?
CodesInChaos

0

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.



0

Ich bin überrascht, dass alle anderen Antworten nicht zwei sehr häufige Verwendungen beim Rechnen für alternative Basen erwähnt haben:

  1. Codierung : Base64-Codierung ist beispielsweise sehr verbreitet. Die Codierung interpretiert einfach eine Reihe von Bytes als eine große binäre Zahl (Basis 2) und konvertiert diese Zahl in eine Base64-Zahl, die durch ASCII-Ziffern dargestellt wird.
  2. 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.

    - 821F6321-881B-4492-8F84-942186DF059B (base-16 guid) 
    becomes
    - RRIDHW463YD8YXX7MIDI (base-36)
    - 3UFmaWDjj9lifYyuT0 (base-62)
    
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.