Wie konvertiert s [i] ^ = 32 Groß- in Kleinbuchstaben?

8
%Vor%

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?

    
Rashed Sami 16.11.2016, 20:13
quelle

3 Antworten

20

^= 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.

    
alain 16.11.2016 20:20
quelle
16
  

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:

%Vor%

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

%Vor% Die

-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 % .

    
πάντα ῥεῖ 16.11.2016 20:36
quelle
5

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.

    
Govind Parmar 16.11.2016 20:55
quelle

Tags und Links