Also ich sehe, dass diese Frage bereits gestellt wurde, aber die Antworten waren ein wenig vage und nicht hilfreich. Okay, ich muss einen c-Ausdruck nur unter Verwendung von "&^~! + | >> < <"Bedingte Anweisung mit bitweisen Operatoren
implementieren Der Ausdruck muss ähneln: a? b: c
Also, von was ich sagen konnte, muss der Ausdruck etwas wie folgt aussehen:
return (a & b) | (~a & c)
Dies funktioniert, wenn a = 0, weil anding es mit b geben Null, und dann wird der oder Ausdruck die rechte Seite zurückgeben, (~a & c)
was funktioniert, weil ~ 0 alle Einsen gibt, und Anding c mit allen Einsen gibt c zurück.
Dies funktioniert jedoch nicht, wenn a> 0 ist. Kann jemand versuchen zu erklären, warum dies so ist oder wie man es beheben kann?
Das ist eigentlich perfekt. Also warum fügt das Addieren alles klar oder deutlich? Ich verstehe, warum das passieren muss, aber ich verstehe nicht, wie das passiert. – atb
Wenn wir mit 0 begonnen haben, dann werden alle Einsen umgedreht. Wenn wir eins hinzufügen, werden alle diese auf Nullen zurückgestellt (und der Übertrag wird gesetzt, aber wir ignorieren ihn). Wenn wir mit 1 begannen, ergibt das Spiegeln der Bits 111 ... 10. Das Hinzufügen von 1 dreht die letzte 0 zu einer 1, so dass alle Bits jetzt 1 sind. –
der 'y = ~ x + 1'-Teil hat mich verwirrt; Ich habe schließlich herausgefunden, dass es aufgrund eines Integer-Überlaufs funktioniert, wenn x = 0 ist, aber es ist nicht offensichtlich. 'y = (x << 31) >> 31': Die für mich mehr klare Lösung ersten Schicht war lsb mit Linksverschiebung msb (00000001 => 10000000) und dann mit Rechtsverschiebung Kopie msb –