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.