Ich habe diesen Code gesehen, der bei Stackoverflow Großbuchstaben in Kleinbuchstaben umwandelt.
Aber ich verstehe die Zeile s[i] = s[i]^32
nicht.
Wie funktioniert es?
^=
ist der Exklusiv-oder Zuweisungsoperator. 32 ist 100000 binär, also schaltet ^= 32
das fünfte Bit im Ziel um. Im ASCII-Format sind Groß- und Kleinbuchstaben 32 Positionen voneinander entfernt, so dass dies von Groß- auf Großbuchstaben und umgekehrt konvertiert wird.
Aber es funktioniert nur für ASCII, nicht für Unicode und nur für Buchstaben. Um portables C ++ zu schreiben, sollten Sie nicht davon ausgehen, dass die Zeichencodierung ASCII ist. Verwenden Sie daher keinen solchen Code. @ πάντα ῥεῖs Antwort zeigt eine Möglichkeit, es richtig zu machen.
Wie funktioniert es?
Sehen wir uns den ASCII-Wert 'A'
an:
'A'
ist binär 1000001
XORed mit 32 (binary 100000
)
ergibt einen Wert, bei dem das obere Zeichen, das das Bit anzeigt, nicht gesetzt ist:
1000001
XOR
%Code%
= 100000
== 1100001
in ASCII.
Jede vernünftige und portable c- oder c ++ - Anwendung sollte 'a'
verwenden:
Die Magie tolower()
(Cargo-Kult) basiert auf ASCII-Tabelle spezifische Zuordnung zu numerischen s[i]=s[i]^32
-Werten.
Es gibt andere char
Codetabellen wie z.B. EBCDIC
, wo das
-Methode kann kläglich die entsprechenden Kleinbuchstaben nicht finden.
Es gibt eine anspruchsvollere C ++ - Version der Konvertierung in Kleinbuchstaben, die auf der Referenzdokumentationsseite von % co_de angezeigt wird % .
In C ++ ist ein char
wie sein Vorgänger C ein numerischer Typ. Dies ist schließlich, wie Zeichen auf der Hardware dargestellt werden und diese Sprachen verbergen das nicht vor dir.
In ASCII haben Buchstaben die nützliche Eigenschaft, dass der Unterschied zwischen einem Groß- und einem Kleinbuchstaben ein einzelnes binäres Bit ist: das fünfte Bit (wenn wir die Nummerierung von rechts beginnen, beginnend bei 0).
Großbuchstabe A wird durch das Byte 0b01000001
( 0x41
in hex) dargestellt, und Kleinbuchstabe a wird durch das Byte 0b01100001
( 0x61
in hex) dargestellt. Beachten Sie, dass der einzige Unterschied zwischen Groß- und Kleinbuchstaben A das fünfte Bit ist. Dieses Muster geht von B nach Z weiter.
Wenn Sie also ^= 32
(was übrigens 2 bis zur 5. Potenz ist) auf eine Zahl stellen, die ein ASCII-Zeichen darstellt, wird das fünfte Bit umgeschaltet - wenn es 0 ist, wird es 1, und umgekehrt, was das Zeichen von Groß- zu Kleinbuchstaben und umgekehrt ändert.