1. bit kippen
-
ich hab auch eins:
x^=~INT_MAX;
-
camper schrieb:
ich hab auch eins:
x^=~INT_MAX;
das kippt das erste bit von 32, aber nicht das erste relevante von x.
-
thordk schrieb:
camper schrieb:
ich hab auch eins:
x^=~INT_MAX;
das kippt das erste bit von 32, aber nicht das erste relevante von x.
wie auch alle anderen vorgestellten Varianten.
x^=INT_MAX-INT_MAX/2;
wenn es unbedingt richtig sein muss.
-
camper schrieb:
x^=INT_MAX-INT_MAX/2;
wenn es unbedingt richtig sein muss.
das toggled ein bit weiter rechts, entspricht etwa ~(unsigned)INT_MAX>>1
geht also auch nicht bei z.b. char...
-
thordk schrieb:
camper schrieb:
ich hab auch eins:
x^=~INT_MAX;
das kippt das erste bit von 32, aber nicht das erste relevante von x.
Da könnt man sich jetzt fragen, was unter 'bit kippen' zu verstehen ist.
Bei dieser Version:
x^=~INT_MAX;
wird denke ich mal das MSB von x invertiert, alle übrigen Bits behalten ihren Wert.
-
thordk schrieb:
camper schrieb:
ich hab auch eins:
x^=~INT_MAX;
das kippt das erste bit von 32, aber nicht das erste relevante von x.
Diese Aussage ist irrelevant.
Es gibt keine relevanten Bits.
-
camper schrieb:
x^=INT_MAX-INT_MAX/2;
wenn es unbedingt richtig sein muss.
Das war richtig, jetzt ist es falsch.
-
Hier mal eine native Version:
x ^= ((unsigned int) ~0) >> 1 ^ ~0;
-
Sagt mal, frickelt ihr so lange an den Shiftings rum, bis es funktioniert, oder wie bekommt ihr das sonst hin? @pale dog: Kannst du mir mal dein Geheimrezept dazu verraten?
-
mikey schrieb:
Sagt mal, frickelt ihr so lange an den Shiftings rum, bis es funktioniert, oder wie bekommt ihr das sonst hin?
Ich... *drumrolls* ... denke!!!
-
-
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);