Aus meiner Lektüre dieser Antwort ist es möglich, ein Paar von zwei 4-Bit-Ganzzahlen mit nur einer Ergänzung und einigen bitweisen Operationen durchzuführen, und der Autor dieser Frage besagt, dass es einfach sein sollte, diese Methode a zu verallgemeinern bisschen. Daher versuche ich, diese Methode auf die Zugabe von vier 8-Bit-Ganzzahlen zu verallgemeinern, die in einer 32-Bit-Ganzzahl 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, Ganzzahlen hinzuzufügen, die im Grunde genommen Komplementform negativer Zahlen in der Nähe von 0 sind. Wenn ich beispielsweise festgelegt habe
Code: Select all
a = 0xfffeff00 // (-1,-2,-1, 0)
b = 0x01010100 // ( 1, 1, 1, 0)
Das erwartete Ergebnis ist 0x00ff0000 . Es läuft < /p>
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 von Summe werden zu FF (was -1 darstellt), die korrekte Zahl sollte jedoch 0 sein. Dies liegt daran, dass beim Subtrahieren von C = 01 00 00 00 00 mit S = 01 01 00 00 die Subtraktion der zweiten Gruppe das Ergebnis in der ersten Gruppe beeinflusst.
Ich möchte den letzten Schritt verbessern, um dieses
Problem zu beseitigen, kann aber keine gute Lösung finden.