2012-09-04 3 views
2

Donc, si j'ai un nombre1 et un autre nombre2 .. les deux entiers, mon approche est-elle corrigée en ajoutant deux nombres en utilisant des opérations au niveau du bit? Cela peut-il aller mal pour n'importe quel cas de test?Opérations bit à bit pour ajouter deux nombres?

public int add(int number1, int number2) 
{ 
int carry = (number1&number2)<<1; 
int sum = number1^number2^carry; 
return sum; 
} 
+1

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

+0

pouvez-vous donner un exemple de ces 2 chiffres? – Phoenix

+2

'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

Répondre

6

Oui. Cette approche ne fonctionne pas pour les ajouts impliquant plusieurs reports. Le plus simple de ces cas est 3 + 1; Par conséquent, votre fonction donne 0.

Il n'y a pas de solution simple pour résoudre ce problème - toute solution doit prendre en compte la largeur d'un nombre entier. Voir Wikipedia's article on gate-level implementations of addition pour certaines approches.

9

Full Adder

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; 
} 
+0

ne fonctionne pas. Je l'ai vérifié pour 3 et 9 et a obtenu 12. En outre, cela ne fonctionne pas pour négatif + positif. – cookya

+3

Fonctionne pour les valeurs positives et négatives, testé pour plus de 500 valeurs – SVashisth

0

Oui, cela ne fonctionnerait pas. Nous pouvons utiliser la boucle while. Voici le code

static int addTwoNumbers(int a, int b) 
{ 
    int carryNum; 

    while(b ! =  0) 
    { 
     carryNum = a & b; 
     a = a^b; 
     b = carryNum << 1; 
    } 
    return a; 
} 
Questions connexes