wake-up-neo.com

Wie unterscheiden sich Groß- und Kleinbuchstaben nur um ein Bit?

Ich habe in einem von Behrouza Forouzan verfassten Buch über Daten- und Kommunikationsnetzwerke ein Beispiel für Groß- und Kleinbuchstaben gefunden, die sich im 7-Bit-Code nur um ein Bit unterscheiden.

Das Zeichen A ist beispielsweise 1000001 (0x41) und das Zeichen a ist 1100001 (0x61). Der Unterschied besteht in Bit 6, das 0 in Großbuchstaben und 1 in Kleinbuchstaben ist. Wenn wir den Code für einen Fall kennen, können wir den Code für den anderen leicht finden, indem wir 32 dezimal addieren oder subtrahieren, oder wir können einfach das sechste Bit spiegeln.

Was bedeutet das alles?

Ich war mit all diesen Dingen sehr verwirrt. Könnte jemand Beispiele liefern, wie diese Dinge wirklich funktionieren?

13
Vibhakar SInha

Lassen Sie uns einen Fall verwenden, der Ihnen vertrauter ist: Basis 10.

  1. Angenommen, wir haben einen 10er-Computer, auf dem jedes 10-Bit einen Wert zwischen 0 und 9 speichert, und ein 10-Byte-Speicher 5 10 Bit lang ist, sodass jedes Byte 100.000 Werte speichern kann (0 bis 99,999).

  2. Sie möchten bestimmte Positionen in einem 10-Byte-Format mit Buchstaben versehen, damit dieser Computer Textdaten mit anderen Computern kommunizieren kann. Eine Möglichkeit, dies zu tun, wäre so:

    00101 A    00201 a
    00102 B    00202 b
    00103 C    00203 c
    00104 D    00204 d
    00105 E    00205 e
    00106 F    00206 f
    00107 G    00207 g
    00108 H    00208 h
    00109 I    00209 i
    00110 J    00210 j
    00111 K    00211 k
    00112 L    00212 l
    00113 M    00213 m
    00114 N    00214 n
    00115 O    00215 o
    00116 P    00216 p
    00117 Q    00217 q
    00118 R    00218 r
    00119 S    00219 s
    00120 T    00220 t
    00121 U    00221 u
    00122 V    00222 v
    00123 W    00223 w
    00124 X    00224 x
    00125 Y    00225 y
    00126 Z    00226 z
    
  3. Sehen Sie, dass sich jeder Kleinbuchstabe nur um eine einzige 10-Bit-Ziffer in der 3. Spalte von rechts von dem Großbuchstaben unterscheidet? Es war nicht so zu gestalten. Es war einfach praktisch, da wir jedes Mal, wenn wir den Buchstaben eines Buchstabens anpassen möchten, einfach eine der Ziffern (10 Bit) ändern können, ohne sich um den Rest der Zahl zu kümmern oder sich mit 26 verschiedenen Transformationen zu beschäftigen, wenn wir können eins . Wir hätten die zweite Ziffer nicht wählen können, weil sie nicht 100, sondern nur 10 sind und sich überschneiden würden.

  4. In der Basis 2 ist es jetzt genau dasselbe, aber anstatt jedes Bit für 0-9 zu repräsentieren, kann es nur 0-1 darstellen. Bei Verwendung von acht 2-Bits ergeben sich nur 256 mögliche Kombinationen (0-255). Die ASCII-Codes für die binären Groß- und Kleinbuchstaben sehen folgendermaßen aus:

    01000001 A        01100001 a
    01000010 B        01100010 b
    01000011 C        01100011 c
    01000100 D        01100100 d
    01000101 E        01100101 e
    01000110 F        01100110 f
    01000111 G        01100111 g
    01001000 H        01101000 h
    01001001 I        01101001 i
    01001010 J        01101010 j
    01001011 K        01101011 k
    01001100 L        01101100 l
    01001101 M        01101101 m
    01001110 N        01101110 n
    01001111 O        01101111 o
    01010000 P        01110000 p
    01010001 Q        01110001 q
    01010010 R        01110010 r
    01010011 S        01110011 s
    01010100 T        01110100 t
    01010101 U        01110101 u
    01010110 V        01110110 v
    01010111 W        01110111 w
    01011000 X        01111000 x
    01011001 Y        01111001 y
    01011010 Z        01111010 z
    

    Genauso wie zuvor unterscheiden sie sich nur um eine 2-Bit-Ziffer, hier in der 6. Spalte von rechts. Eine Ziffer weiter rechts (kleiner) hätten wir nicht verwenden können, da sich die Listen überschneiden würden (2 ^ 5 = 32 und dementsprechend haben wir alle Bits 0 bis 5 verwendet, aber 2 ^ 4 = 16, was nicht abgedeckt werden konnte) die 26 Buchstaben des Alphabets).

  5. Um nur ein wenig auszufüllen, hier ein Beispiel, was diese binären Werte bedeuten. Nehmen wir die für G. Um zu verstehen, was 01000111 binär bedeutet:

     Pos:   7  6  5  4  3  2  1  0
     Bit:   0  1  0  0  0  1  1  1
     Val: 128 64 32 16  8  4  2  1
    Mult:   0 64  0  0  0  4  2  1
     Add: 64 + 4 + 2 + 1 = 71, which is the ASCII code for G.
    

    Dasselbe tun Sie für den Buchstaben G in dem oben beschriebenen speziellen Basis-10-System:

      Pos:     4    3    2    1    0
    10Bit:     0    0    1    0    7
      Val: 10000 1000  100   10    1
     Mult:     0    0  100    0    7
      Add: 100 + 7 = 107, which is my special 10ASCII code for G.
    

    Schauen Sie sich die Zeile "Val" für binär an. Sehen Sie, dass von rechts jeder Wert doppelt so groß ist wie der vorherige? Verdoppelt sich jedes Mal, wenn wir 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 usw. erhalten. Auf diese Weise bestimmt die Position einer Binärziffer ihren Wert, genau wie die Position einer Dezimalziffer ihren Wert mit Potenzen von 10: 1, 10, 100, 1000, 10000, 100000 usw. bestimmt.

    Mir ist klar, dass dies dumm erscheint, denn ich habe nur 107 in 107 konvertiert ... aber 107 ist nicht nur eine Zahl, es ist eine Kurzform für:

    1 hundreds + 0 tens + 7 ones.
    

    Eine andere Art, wie wir das darstellen könnten, ist

    0 x 10^4 + 0 x 10^3 + 1 x 10^2 + 0 x 10^1 + 7 x 10^0.
    

    Ebenso ist 01000111 nicht nur eine binäre Zahl, sondern eine Kurzform für

    0 x 2^7 + 1 x 2^6 + 0 x 2^5 + 0 x 2^4 + 0 x 2^3 + 1 x 2^2 + 1 x 2^1 + 1 x 2^0
    

    Was ich Ihnen schon gezeigt habe:

    0 + 64 + 0 + 0 + 0 + 4 + 2 + 1
    = 64 + 4 + 2 + 1
    = 71
    

Möglicherweise haben Sie sich auch gefragt, was 0x41 und 0x61 bedeuten. Der 0x-Teil gibt an, dass die folgenden Ziffern als Hexadezimalzahlen (Basis 16) zu verstehen sind. In unserem Zahlensystem gibt es nur 10 Ziffern. Wir benötigen also 6 weitere Ziffern. Daher verwendet hexadezimal die Ziffern 0-9 und behandelt die Buchstaben AF als verbleibende Ziffern, wobei A 10 bis F bis 15 ist. Hexadezimal ist für Computer sehr praktisch, da 16 eine Potenz von 2 und somit ein 8-Bit-Byte ist Zum Kodieren werden genau zwei Hex-Ziffern benötigt (und jede Hex-Ziffer codiert genau vier Binär-Ziffern). Wenn Sie 0x41, 4 zu seiner Binärdarstellung 0100 und zu 1 zu seiner Binärdarstellung 0001 erweitern, erhalten Sie 01000001. Sie sehen den Code für A wie gezeigt. Um es in Dezimalzahl umzuwandeln, ist es 4 x 16 + 1 x 1 = 65. Wir multiplizieren die 4 mit 16, da jede aufeinanderfolgende hexadezimale Ziffer nach links das 16-fache der vorherigen Ziffer ist und demselben Muster folgt, das ich Ihnen oben für Basis 2 und 10 gezeigt habe .

Ich hoffe, das reicht aus, um etwas mehr über binäre und ASCII-Codes zu verstehen.

Anmerkung 1: Der Grund für 8 Bits in einem Byte anstelle von 2, wie Sie vielleicht denken, ist, dass in den frühen Tagen des Rechnens entschieden wurde, dass 8 eine viel nützlichere Anzahl von Bits ist 2-Bit "Byte" würde nur 4 Werte codieren. Um nur die Groß- und Kleinbuchstaben des Alphabets zu übertragen, wären 3 Byte erforderlich! Binäres enthält nichts, was die Auswahl von 8 Bits pro Byte erzwingt, außer, dass 8 auch eine Potenz von 2 ist, was die mathematische Arbeit beim Arbeiten mit binären Informationen vereinfacht und die Kanten an den Kanten besser ausrichten. Wenn sie 6 Bits pro Byte gewählt hätten, bin ich mir sicher, dass die Dinge unangenehm geklappt hätten und nicht die gesamte Bandbreite der verfügbaren Werte genutzt hätten.

Hinweis 2: Mein System mit fünf Bits in einem 10-Byte-Format basiert auf der Unpraktikabilität der Verwendung von zehn 10-Bit-Bits pro Byte. Dies ergibt eine sehr große Anzahl, die viel Speicherplatz verschwenden würde. Ich habe fünf gewählt, weil zehn davon gleichmäßig teilbar sind, was zweifellos nützlich wäre. (Ursprünglich verwendete meine Antwort zehn 10 Bit pro 10 Byte, aber sie war zu groß!)

35
ErikE

Diese Beziehung zwischen Groß- und Kleinbuchstaben war beabsichtigt. Als der ASCII-Code formuliert wurde, war die Computerhardware primitiv und es war Software erforderlich, um jedes Byte zu sparen. Das Umdrehen eines einzelnen Bits erfordert nur sehr wenig Hardware oder Code.

3
Mark Ransom

http://asciitable.com/

0x61 is hexadecimal for 97 = a
0x41 is hexadecimal for 65 = A

Durch das Abziehen/Hinzufügen von Dezimalzahlen 32 können Sie also in Groß-/Kleinschreibung umwandeln.

Z is 90 = 0b1111010    = 0x5A
z is 122 = 0b1011010   = 0x7A

Was ist ein Unterschied von 0b01000000 in binär oder 0x20 oder 32 in dezimal.

Das Umschalten des 6. Bits ändert also den Fall.

1
Gazler

Ich denke, die meisten dieser Antworten sind unnötig kompliziert und gelegentlich herablassend. 

Die Zuordnung von Dezimalzeichen zu ASCII-Zeichen ist willkürlich und hat nicht wirklich etwas mit dem Verständnis der Funktionsweise von Basis 2 oder Basis 10 zu tun. Es ist nur eine Convenience-Sache. Wenn jemand versehentlich einen Kleinbuchstaben codiert, aber einen Großbuchstaben bedeutet, ist es bequemer, nur ein Bit umzudrehen, anstatt ein ganzes Byte umcodieren zu müssen. Es ist weniger anfällig für menschliches Versagen, nur ein Bit zu drehen. WENN die Ausgabe 'a' ist, wir aber 'A' wollten, wissen wir zumindest, dass wir das meiste richtig verstanden haben und wir müssen einfach 2 ^ 5 umdrehen, um 32 zu addieren oder zu subtrahieren. So einfach ist das. Warum genau Bit 5 auswählen (es ist nicht 6, wie einige gesagt haben, Sie beginnen mit 0 ..), klar, es ist derjenige, der sinnvoll ist, um zwei Bereiche von 26 Zeichen mit nur einem Bit Flip zu erfüllen. Wenn Sie dies zu einem niedrigeren Wert tun, müssten Sie mehr als eine Wende machen. 

1
shake

Um 32 addieren oder subtrahieren zu können, müssen Sie zuerst wissen, ob das Zeichen größer oder kleiner als 'A' ist.

Als dieses Buch geschrieben wurde, hatten die meisten Programmiersprachen keine Strings oder .equalsIgnoreCase. Dies war vor 1818n, und wenn ein Unternehmen über einen Server verfügte, würden Sie telnet (wie Xterm) darauf zugreifen und ein Befehlszeilenmenü erhalten. Was er beschreibt, wurde in der Regel verwendet, um für Ihre Benutzer ein Menü ohne Berücksichtigung der Groß- und Kleinschreibung zu erstellen, wobei das numerische Layout der ASCII-Tabelle genutzt wurde. 

Es kann sehr schnell sein, da es bitweise Assembler-Anweisungen gibt, um die Berechnungen in beiden Richtungen auszuführen, unabhängig davon, ob die Zeichen bereits Groß- oder Kleinbuchstaben sind.

c = c | 32 // in Großbuchstaben

c = c & (1 + 2 + 4 + 8 + 16 + 0 + 64 + 128) // in Kleinbuchstaben

Angenommen, Sie hatten eine Java-ähnliche Sprache ohne Objekte oder die Standard-Bibliotheken. Ihr Autor des Netzwerks fordert Sie auf, folgenden Code zu schreiben:

    public static void main()
    {
        println("What would you like to do?");
        println("Inventory (inv)");
        println("Reports (rep)");

        char[] ca = readUserInput();        
        for (int i = 0; i < ca.length; i++)
            ca[i] = ca[i] | 32;  // convert to uppercase, by ensuring bit 32 is set

        if (compareInput(ca, "INV") == true)
            doInventory();
    }

Haben Sie versucht, Google zu durchsuchen, und manchmal den Namen einer Person großgeschrieben?

1
Brian Maltzan

werfen Sie einen Blick darauf, das 6. Bit = 32, wenn Sie es umdrehen, subtrahieren Sie oder addieren Sie 32

Bit value
1   1
2   2
3   4
4   8
5   16
6   32 (32 = hex 20)

Wenn Sie hier http://asciitable.com/ suchen, können Sie die ASCII-Tabelle für alle Zeichen sehen und werden feststellen, dass A = 65 und a = 97

1
SQLMenace
template<char TLBound, char TUBound>
struct CharRange
{
    enum 
    {
        LBound = TLBound,
        UBound = TUBound
    };

    static bool InRange(char ch)
    {
        return (ch >= LBound)  && (ch <= UBound);
    };
};

typedef CharRange<'a', 'z'> lcaseLetters;
typedef CharRange<'A', 'Z'> ucaseLetters;

char toUpper(char ch)
{
    if(lcaseLetters::InRange(ch))
    {
        return (ch ^ (0x1 << 5));
    }

    return ch;
}

char toLower(char ch)
{
    if(ucaseLetters::InRange(ch))
    {
        return (ch ^ (0x1 << 5));
    }

    return ch;
}
0
Nitheesh George