2010-06-20 8 views
4

Si j'ai un entier en Java, comment puis-je compter combien de bits sont-ils à zéro, sauf pour les zéros en tête?Nombre de bits zéro en nombre entier sauf les zéros en tête

Nous savons que les entiers en Java ont 32 bits mais en comptant le nombre de bits définis dans le nombre, puis en soustrayant de 32 ne me donne pas ce que je veux car cela inclura également les zéros en tête.

A titre d'exemple, le nombre 5 a un bit zéro car en binaire, il est 101.

+1

Définir l'expression "pas correct". – Stephen

+0

J'ai modifié cette question en fonction d'un commentaire posté sur l'original de ma réponse. –

+0

Voir: http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#bitCount(int) et http://java.sun.com/javase/6/docs /api/java/lang/Integer.html#numberOfLeadingZeros(int) – laura

Répondre

3

Pour compter les zéros non leader en Java, vous pouvez utiliser cet algorithme:

public static int countNonleadingZeroBits(int i) 
{ 
    int result = 0; 
    while (i != 0) 
    { 
     if (i & 1 == 0) 
     { 
      result += 1; 
     } 
     i >>>= 1; 
    } 
    return result; 
} 

Cet algorithme sera assez rapide si vos entrées sont généralement de petite taille, mais si votre entrée est généralement un plus grand nombre, il peut être plus rapide d'utiliser une variation sur l'un des algorithmes de hack bit sur this page.

+0

oui mais donné le numéro 5 // 101 voici 1 zéro et non 30 –

+1

@ davit-datuashvili: Donc, vous voulez compter les zéros à part des zéros de tête? –

+0

'5 = 000 ... 000101'. La chose que vous voulez est le numéro du dernier bit (le plus significatif) qui est défini plus un et moins le nombre de bits qui est défini. – ony

1

Comptez le nombre total de "bits" dans votre nombre, puis soustrayez le nombre de ceux du nombre total de bits.

1

Ce que j'aurais fait.

public static int countBitsSet(int num) { 
    int count = num & 1; // start with the first bit. 
    while((num >>>= 1) != 0) // shift the bits and check there are some left. 
     count += num & 1; // count the next bit if its there. 
    return count; 
} 

public static int countBitsNotSet(int num) { 
    return 32 - countBitsSet(num); 
} 
+0

Le '32 -x 'n'est pas ce que veut l'OP. Les bits qui sont en train d'être comptés ne sont pas tous 32, c'est seulement jusqu'au dernier bit défini. (Il ne l'a pas bien expliqué dans la question originale) – Stephen

-2

Depuis ordre d'évaluation en Java est defined, nous pouvons le faire:

public static int countZero(int n) { 
    for (int i=1,t=0 ;; i<<=1) { 
     if (n==0) return t; 
     if (n==(n&=~i)) t++; 
    } 
} 

Notez que cette repose sur le LHS d'une égalité en cours d'évaluation en premier lieu; essayez la même chose en C ou C++ et le compilateur est libre de vous donner l'air idiot en mettant votre imprimante en feu.

+2

-1 Pour un code extrêmement illisible. – starblue

0

Utilisation des fonctions intégrées:

public static int zeroBits(int i) 
{ 
    if (i == 0) { 
     return 0; 
    } 
    else { 
     int highestBit = (int) (Math.log10(Integer.highestOneBit(i))/
       Math.log10(2)) + 1; 
     return highestBit - Integer.bitCount(i); 
    } 
} 
6

un coup d'oeil à la documentation de l'API de Integer:

32 - Integer.numberOfLeadingZeros(n) - Integer.bitCount(n) 
Questions connexes