1. bit kippen
-
-
Du bist doch so fit im shiften, erklär mir das mal.
-
mikey schrieb:
Du bist doch so fit im shiften, erklär mir das mal.
willst du wissen was << und >> machen, oder was?
das ist doch nicht schwer...
-
Ne, etwas ungenau ausgedrückt. Ich möchte wissen, wie man auf eine solche Lösung kommt:
x ^= ((unsigned int) ~0) >> 1 ^ ~0;
Gibt's dafür irgendwelche Formeln, oder hat sich das groovemaster aus dem Finger gesaugt? Ich komme da nämlich nicht ganz mit.
-
doggi wird Zeit deinen Namen zu wechseln
-
mikey schrieb:
Gibt's dafür irgendwelche Formeln, oder hat sich das groovemaster aus dem Finger gesaugt?
eindeutig aus den fingern gesaugt.
ein ~0 bedeutet, dass alle bits (vorher alles nullen) umgedreht werden, das ergibt 0xffffffff (bei 32 bit int's) oder auch -1
er möchte gern, dass beim rechts schieben eine 0 reinkommt, deswegen der cast nach unsigned, nach dem shift ((unsigned int) ~0) >> 1, hat er 0x7fffffff.
das ist ganz links eine 0 und 31 einsen. weil er aber das genaue gegenteil davon will, verknüpft er das ganze XOR mit ~0, also mit 0xffffffff und hat dann 0x80000000 (ganz links eine 1 und der rest sind alles nullen). damit hat der das höchstwertige bit gebastelt, mit dem er dann x verknüpfen kann.
er hätte auch gleich INT_MIN nehmen können, aber das ist ihm wohl gerade nicht eingefallen...
KasF schrieb:
doggi wird Zeit deinen Namen zu wechseln
glaub's auch...
-
pale dog schrieb:
oder auch -1
Oder auch UINT_MAX
-
pale dog schrieb:
er hätte auch gleich INT_MIN nehmen können, aber das ist ihm wohl gerade nicht eingefallen...
Doch, schon. Aber es gibt halt Leute (wie mich
), die sowas gerne ohne externe Abhängigkeiten lösen. Deshalb schrieb ich ja auch "native Version".
Im Nachhinein ist mir übrigens noch eine Vereinfachung aufgefallen. Manchmal denkt man halt einfach noch zu kompliziert. *kopfbrett*x ^= ~((unsigned int) ~0 >> 1);
-
groovemaster schrieb:
x ^= ~((unsigned int) ~0 >> 1);
fein, *du* bist nämlich der schiebekönig
-
groovemaster schrieb:
x ^= ~((unsigned int) ~0 >> 1);