if (val & ~0xff) ist doch immer false?
-
Im Source von git, sha1_file.c:
int get_sha1_hex(const char *hex, unsigned char *sha1) { int i; for (i = 0; i < 20; i++) { unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]); if (val & ~0xff) return -1; *sha1++ = val; hex += 2; } return 0; }
Der Ausdruck
if (val & ~0xff)
ist doch immer false, oder?
Da
0xff = 1111 1111
~0xff = 0000 0000und irgendwas bitweise verundet mit 0 ist immer 0?
Welchen Sinn hat diese Zeile?Oder hätte ich einfach nur mehr schlafen sollen heute Nach?
-
val ist ein unsigned int und ist sehr wahrscheinlich größer als 8 Bit. Entsprechend prüft der Ausdruck ob Bits oberhalb der 8 Bits gesetzt sind.
(Bsp für 16 Bit, LE)
0xff = 0000 0000 1111 1111
~0xff = 1111 1111 0000 0000
-
vielleicht gibt hexval(x) ja z.B. -1 zurück wenn x keine hex-digit ist? dann würde es nämlich sinn machen.
-
Rüdiger hat es ja erklärt.
Ich habe nicht besonders gut nachgedacht und das 0xff auf 0xffff erweitert (bzw. alles 1).
Das war das Problem. Jetzt ist es klar
-
ihoernchen schrieb:
Ich habe nicht besonders gut nachgedacht und das 0xff auf 0xffff erweitert (bzw. alles 1).
stell dir einfach vor was ~1, ~2, ~3, usw. sein könnte, also nicht 0. warum sollte ~255 da eine ausnahme machen?
-
Das hab ich nicht verstanden.
~255 ist null, sofern ich einen 8 bit Datentyp hab.Mache ich das auf einen Datentyp > 8 bit habe ich eine Zahl > 255 (bei einem Startwert von 255).
Mein Problem war, dass ich das 0xff in Gedanken auf 0xffff erweitert habe und nicht auf 0x00ff.
-
mal eine ganz dummer frage: wofür brauchst du das?
-
ihoernchen schrieb:
Das hab ich nicht verstanden.
~255 ist null, sofern ich einen 8 bit Datentyp hab.und ~1 ist null, wenn du einen 1-bit datentyp hast. also hast du's ja doch verstanden.
-
ghorst schrieb:
mal eine ganz dummer frage: wofür brauchst du das?
fricky schrieb:
ihoernchen schrieb:
Das hab ich nicht verstanden.
~255 ist null, sofern ich einen 8 bit Datentyp hab.und ~1 ist null, wenn du einen 1-bit datentyp hast. also hast du's ja doch verstanden.
Also die Definition des Komplements sollte folgendem entsprechen x - ~x = 0, sonst wäre es ja nicht das Komplement, somit wäre bei einem 1-Bit Typ das Komplement gerade der Wert selbst.
-
Äh?? schrieb:
Also die Definition des Komplements sollte folgendem entsprechen x - ~x = 0, sonst wäre es ja nicht das Komplement, somit wäre bei einem 1-Bit Typ das Komplement gerade der Wert selbst.
da kann irgendwas nicht stimmen. woher ist diese definition?
-
Äh?? schrieb:
Also die Definition des Komplements sollte folgendem entsprechen x - ~x = 0,
x**+**~x=0
-
Nur im Einerkomplement.
-
~ flippt einfach alle bits, was das für auswirkungen auf die zahl hat schreibt der standard AFAIK nicht vor.
normalerweise wird two's complement verwendet, also -x == ~x + 1 wenn ich mich jetzt nicht irre
-
hustbaer schrieb:
~ flippt einfach alle bits, was das für auswirkungen auf die zahl hat schreibt der standard AFAIK nicht vor.
normalerweise wird two's complement verwendet, also -x == ~x + 1 wenn ich mich jetzt nicht irre
So siehts aus, dann ist nämlich a - b == a + ~b + 1.