Frage

Ich frage mich, ob es eine effiziente Art und Weise war es, eine Verschiebung nach rechts auf einer 8-Bit-Binärwert nur mit ALU-Operatoren (NOT, OR, AND, XOR, ADD, SUB)

auszuführen
Example:

input:  00110101
output: 10011010

ich in der Lage gewesen, eine Verschiebung implementieren gelassen, indem einfach die 8-Bit-Binärwert mit sich selbst, da eine Verschiebung links von 2 zu multiplizieren jedoch äquivalent ist, kann ich mir nicht von einer Art und Weise dieses Recht für Verschiebung zu tun.

Die einzige Methode, die ich bisher mit oben kommen muß, ist nur 7 linke Lauf Verschiebungen führen. Ist dies der einzige Weg?

War es hilfreich?

Lösung

Es ist trivial, um zu sehen, dass dies nicht mit {AND, OR, XOR, NOT} getan werden kann. Für alle diese Operatoren hängt outbit [N] auf inbit1 [N] und inbit2 [N] nur . Und fügt eine Abhängigkeit von inbit1 [N] .. inbit1 [0] und inbit2 [N] .. inbit2 [0]. Doch in Ihrem Fall benötigen Sie eine Abhängigkeit von InBIT [N + 1]. Daher folgt daraus, dass, wenn es eine Lösung ist, muss er eine SUB umfassen.

Allerdings A - B ist nur A + (-B) die A + ((B XOR 11111111) +1) ist. Daher, wenn es eine Lösung mit SUB war, könnte es als eine Lösung neu geschrieben werden, anstatt mit ADD und XOR. Wie wir gezeigt haben, sind die Betreiber nicht ausreichend. Daher ist die Menge {ADD, OR, XOR, NOT, ADD, SUB} zu unzureichend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top