Voici comment un concepteur de circuit ajouterait deux numéros. Pour traduire, les deux symboles en haut avec les bords gauches à double courbe sont XOR (^), les deux au milieu avec les bords plats à gauche sont AND (&), et le dernier avec le bord gauche incurvé simple est OR (|). Maintenant, voici comment vous pourriez traduire cela en code, un bit à la fois, en utilisant un masque.
public int add(final int A, final int B) {
int mask = 1;
int sum = 0;
int carry = 0;
for (int i = 1; i <= Integer.SIZE; i++) { //JVM uses 32-bit int
int a = A & mask; //bit selection
int b = B & mask;
//sum uses |= to preserve the history,
//but carry does not need to, so it uses =
sum |= a^b^carry; //essentially, is the sum of bits odd?
carry = ((a & b) | ((a^b) & carry)) << 1; //are exactly two of them 1?
mask <<= 1; //move on to the next bit
}
return sum;
}
Si vous branchez quelques nombres non-triviaux, vous vous rendez compte que c'est faux. Les additionneurs doivent être enchaînés les uns après les autres. (indice: vous avez besoin d'une boucle) – Mysticial
pouvez-vous donner un exemple de ces 2 chiffres? – Phoenix
'3 + 1' comme indiqué dans la réponse jusqu'à présent. Tout ce qui porte enchaîné aura aussi tort, '63 + 1',' 127 + 1', etc ... – Mysticial