bitoperator?

Pherseus

Erfahrenes Mitglied
Code:
#include <stdio.h>

void allesGross(char *text)
{
    int i;
    while(*text != 0)
        *text = *text++ &= 0x5f; 
}

int main(void) {
    char bla[] = "moep";
    allesGross(bla);
    printf("%s",bla);
    return 0;
}

Hi, im obigen Code wird mit &= 0x5f alles in Grossbuchstaben umgewandelt. Doch wie funktioniert dies? Ich denke mal das es sich um einen Bitoperator handelt, bin mir aber nicht sicher um welchen und wie er funktioniert. Außerdem ist mir unklar wofür der Hexadezimal wert steht.
 
Hi.

Also erstmal enthält die Funktion einen undefinierten Ausdruck:
C:
*text = *text++ &= 0x5f;
In diesem Ausdruck wird mehrfach auf eine Speicherstelle schreibend zugeriffen, was laut C Standard zu undefinierten Verhalten führt (siehe http://c-faq.com/expr/seqpoints.html)

Das kann man hier aber leicht umgehen, da die doppelte Zuweisung auch völlig unsinnig ist. (Oder war das nur ein Tippfehler?)

Der &= Zuweisungsoperator kombiniert den Wert des lvalue auf der linken Seite mit dem Wert auf der anderen Seite indem er die Werte bitweise und-verknüpft und speichert das Ergebnis in der Variablen die auf der linken Seite angegeben ist.

Wenn man sich in der ASCII Tabelle mal die Werte für die Klein- bzw. Großbuchstaben anschaut und vergleicht, stellt man fest das sich diese nur im 5 Bit unterscheiden:

____6 5 4 3 2 1 0
A = 1 0 0 0 0 0 1
a = 1 1 0 0 0 0 1

B = 1 0 0 0 0 1 0
b = 1 1 0 0 0 1 0
usw.

D.h. alles was man tun muß um einen kleinen Buchstaben in den Großbuchstaben umzuwandeln ist das 5te Bit zu löschen. Genau das erreicht man wenn man als Bitmaske
1 0 1 1 1 1 1 == 0x5f verwendet.

Falls der Buchstabe schon ein Großbuchstabe ist, schadet die Funktion natürlich auch nichts.

Gruß
 
Beides ist ja auch ein- und dasselbe.

0x5f = 95

das eine ist nur dei Hexadezimale Darstellung, das andere die Dezimale. Wenn es um Bitfelder geht bevorzuge ich die Hexadezimale Variante, weil ich da das Bitmuster direkt ablesen kann ;)
 
Mal ein kleiner Hinweis:

Das da kommt vermutlich aus Amiland, wo scheinbar keiner über Englisch rausdenkt (Sorry, böse Stereotype).

A) Mit Umlauten klappt das nicht
B) wenn da was anderes als Buchstaben drin ist, wird es zerhunzt
C) es werden ausser den 26 Buchstaben auch die passenden 102 anderen Zeichen, die dieses Bit gesetzt haben, zersägt.
 
Zurück