2012-08-07 2 views
0

Je le code Java suivant:Java - Bit manipulation

long a = Long.parseLong("11001100", 2); 
long b = Long.parseLong("11000000", 2); 
int npos = 0 ; 
int pos = 0 ; 
long n = ~(a^b) ; 
int cnt = 0; 
while (n != 0) { 
    pos++ ; 
    if ((n & 3) == 3) cnt++; // count how many matches 
    else{ 
    npos = pos ; // position that not matched also giving wrong which should be 2 nd position. 
    } 
    n >>>= 2; 
} 

System.out.println(npos + " " + cnt) ; // also print which two bits are not matched i.e. 00 and 11 

Je suis en train de trouver combien de séquences correspondent à deux bits dans deux entiers. Je veux aussi trouver quels deux bits ne correspondent pas. Quelqu'un peut-il m'aider à faire cela? PS: Je n'ai pas la chaîne dans mon code d'origine, j'ai seulement des entiers. Par conséquent, je ne peux pas faire de manipulation de chaîne.

Edit:

long a = Long.parseLong("11000100", 2); 
long b = Long.parseLong("11000000", 2); 
long mask = 0x03; 
int npos = 0 ; 
int cnt = 0; 
long p1 = 0; 
long p2 = 0; 
for (int pos = 0; pos < 64; pos++, mask <<= 2) { 

    if ((a & mask) == (b & mask)) { 
    cnt++; // count how many matches 
    } else { 
    npos = pos ; // *last* position that did not match 
    p1 = (a & mask) ; // two bits that not matched 
    p2 = (b & mask) ; // two bits that not matched 
    } 
} 

    System.out.println(npos + " " + cnt + " " + p1 + " " + p2) ; // also print which two bits are not matched i.e. 00 and 01 
+1

en ce qui concerne votre fermeture com ment - si la manipulation de chaînes était le meilleur moyen de résoudre ceci, il est * trivial * d'obtenir une chaîne de caractères de la chaîne ints ('String.valueOf (a)'). –

+0

@AndrzejDoyle fwiw, il y a aussi 'Integer.toString (a)'. –

+0

Je n'ai aucune idée de ce que cette question demande. – Wug

Répondre

3

Vous analysez les entiers comme base 10 chiffres, où vous voulez probablement les analyser comme des entiers binaires, à faire utiliser la méthode qui a un paramètre radix:

long a = Long.parseInt("11001100", 2); 
long b = Long.parseInt("11000000", 2); 

Il pourrait être plus facile à exécuter juste une boucle comparant les 2 valeurs à l'aide d'un masque:

long mask = 0x03; 
int npos = 0 ; 
int cnt = 0; 

for (int pos = 0; pos < 32; pos++, mask <<= 2) { 

    if ((a & mask) == (b & mask)) { 
    cnt++; // count how many matches 
    } else { 
    npos = pos ; // *last* position that did not match 
    } 
} 
+0

désolé, cela devrait être. Mais, comment trouver la position et la valeur mésappariée? – Arpssss

+0

Si vous avez besoin de gérer les discordances, vous pouvez ajouter leur position et leur masque à une liste pour inspecter après la boucle. – rsp

+0

Comme l'a dit rsp, une liste peut être utile. Aussi je préférerais voir la condition de boucle comme pos Humungus

Questions connexes