compter le nombre de uns dans la représentation binary d’un nombre

Dupliquer possible:
Le meilleur algorithme pour compter le nombre de bits définis dans un entier de 32 bits?

Je veux savoir combien de 1 y a-t-il dans la représentation binary d’un nombre.J’ai 2 logiques.

  1. int count =0; int no = 4; while(no!=0){ int d = no%2; if(d==1) count++; no = no/2; str = str+ d; } 
  2. La seconde logique est de continuer à masquer le numéro de manière itérative avec 1,2,4,8,32 et de vérifier si le résultat est 1,2,4, 8 ….. Je ne reçois pas la condition qui devrait être la fin de la boucle.

Utilisez l’API Java (java 5 ou supérieure).

 Integer.bitCount(int); Long.bitCount(long); 

NOTE: Les méthodes Java ci-dessus sont basées sur le plaisir du pirate

plus rapide que n’importe laquelle des réponses précédentes: (proportionnelle au nombre de 1 bits plutôt qu’au nombre total de bits)

 public class Foo { public static void main(Ssortingng[] argv) throws Exception { int no = 12345; int count; for (count = 0; no > 0; ++count) { no &= no - 1; } System.out.println(count); } } 

On dirait que c / c ++ / c #, si donc vous avez décalage .. il suffit de boucler vers N-1 bits à partir de 0 et d’utiliser sum+=(value>>i)&1

C’est-à-dire que vous vérifiez toujours le dernier bit / le plus à droite, mais déplacez la représentation binary du nombre vers la droite pour chaque itération jusqu’à ce que vous n’ayez plus de bits à vérifier.

En outre, pensez à signé / non signé et à tout format entier. Mais vous ne précisez pas comment cela devrait être traité dans la question.

Une idée couramment utilisée pour compter ceux-ci est de construire un tableau de recherche contenant les réponses à chaque octet, puis de scinder votre nombre en quatre octets et de faire la sum des totaux. Cela nécessite quatre recherches et est assez rapide. Vous pouvez construire cette table en écrivant un programme qui calcule manuellement la réponse (peut-être en utilisant votre programme ci-dessus), puis en écrivant une fonction comme celle-ci:

 private static final int[] BYTE_TOTALS = /* ... generate this ... */; public static int countOneBits(int value) { return BYTE_TOTALS[value & 0xFF] + BYTE_TOTALS[value >>> 8 & 0xFF] + BYTE_TOTALS[value >>> 16 & 0xFF] + BYTE_TOTALS[value >>> 24 & 0xFF]; } 

J’espère que cela t’aides!

Nous pouvons utiliser le débordement pour votre boucle:

 int count = 0; int number = 37; int mask = 1; while(mask!=0) { int d = number & mask; if(d != 0) count++; /* Double mask until we overflow, which will result in mask = 0... */ mask = mask << 1; str = str+ d; } 

Il y a différentes façons de le faire très rapidement.

MIT HAKMEM Count

 int no =1234; int tmp =0; tmp = no - ((no >> 1) & 033333333333) - ((no >> 2) & 011111111111); System.out.println( ((tmp + (tmp >> 3)) & 030707070707) % 63); 

Votre condition finale devrait garder une trace de la magnitude du bit auquel vous vous trouvez; s’il est plus grand que le nombre d’origine, vous avez terminé (vous n’obtiendrez plus que des 0).

Oh, et puisque vous n’avez pas spécifié de langue, voici une solution Ruby 🙂

 class Integer def count_binary_ones to_s(2).scan('1').length end end 42.count_binary_ones #=> 3 

Que diriez-vous d’utiliser la classe BigInteger.

 public void function(int checkedNumber) { BigInteger val = new BigInteger(Ssortingng.valueOf(checkedNumber)); val = val.abs(); int count = val.bitCount(); Ssortingng binarySsortingng = val.toSsortingng(2); System.out.println("count = " + count); System.out.println("bin = " + binarySsortingng); } 

Le résultat de la fonction (42); suit.

 count = 3 bin = 101010