So führen Sie die Addition zweier Vektoren von 8-Bit-Ganzzahlen mit einer einzigen Addition in C/C++ durchC++

Programme in C++. Entwicklerforum
Anonymous
 So führen Sie die Addition zweier Vektoren von 8-Bit-Ganzzahlen mit einer einzigen Addition in C/C++ durch

Post by Anonymous »

Nach meiner Lektüre dieser Antwort ist es möglich, zwei Paare von 4-Bit-Ganzzahlen, die in 8-Bit-Ganzzahlen gespeichert sind, mit nur einer Addition und einigen bitweisen Operationen zu addieren. Außerdem gibt der Autor dieser Antwort an, dass es einfach sein sollte, diese Methode ein wenig zu verallgemeinern. Daher versuche ich, diese Methode auf die Addition von zwei Vektoren zu verallgemeinern, die jeweils aus vier 8-Bit-Ganzzahlen bestehen und in 32-Bit-Ganzzahlen gespeichert sind.

Code: Select all

uint32_t a, b;

uint32_t c = a + b;
uint32_t r = a ^ b ^ c; // calculate all carry
uint32_t s = r & (0x01010100); // carry of only the digits that we care
uint32_t sum = c - s; // undo the carry on these digits
Dieser Code funktioniert für die meisten Eingaben, aber ich habe Ausnahmen gefunden, wenn ich versuche, ganze Zahlen hinzuzufügen, die im Grunde eine Komplementform negativer Zahlen nahe 0 sind. Zum Beispiel, wenn ich
einstelle

Code: Select all

a = 0xfffeff00 // (-1,-2,-1, 0)
b = 0x01010100 // ( 1, 1, 1, 0)
erwartetes Ergebnis ist 0x00ff0000. Es läuft

Code: Select all

c = 0x01000000 // ( 1, 0, 0, 0)
r = 0xfffffe00 // (-1,-1,-2, 0)
s = 0x01010000 // ( 1, 1, 0, 0)
sum=0xffff0000 // (-1,-1, 0, 0)
Die ersten beiden Ziffern der Summe werden zu ff (was -1 darstellt), aber die korrekte Zahl sollte 0 sein. Dies liegt daran, dass beim Subtrahieren von c = 01 00 00 00 mit s = 01 01 00 00 die Subtraktion der zweiten Gruppe überläuft und sich auf das Ergebnis der ersten Gruppe auswirkt.
Ich möchte den letzten Schritt verbessern, um dieses Problem zu beseitigen, kann aber keine gute Lösung finden.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post