Comptage de bits utilisés dans int
Si vous avez le nombre binaire 10110 comment puis-je le faire revenir 5? e.g un nombre qui indique combien de bits sont utilisés? Il y a quelques même les exemples ci-dessous:
- 101 doit revenir 3
- 000000011 doit retourner 2
- 11100 devrait revenir 5
- 101010101 doit retourner 9
Comment cela peut-il être obtenu de la façon la plus simple en Java? Je suis venu avec la méthode suivante, mais je peux être plus rapide:
public static int getBitLength(int value)
{
if (value == 0)
{
return 0;
}
int l = 1;
if (value >>> 16 > 0) { value >>= 16; l += 16; }
if (value >>> 8 > 0) { value >>= 8; l += 8; }
if (value >>> 4 > 0) { value >>= 4; l += 4; }
if (value >>> 2 > 0) { value >>= 2; l += 2; }
if (value >>> 1 > 0) { value >>= 1; l += 1; }
return l;
}
en java int toujours utilise 32 bits
Il semble que vous manuellement déroulé une boucle, là.
Le titre est trompeur, car tous les 32 bits sont toujours utilisés dans un int.
Je sais le titre est un peu trompeur, mais je ne sais pas comment l'appeler, si vous avez des suggestions merci de nous l'envoyer et je vais modifier le titre.
Remarque ce sont les mêmes que
Il semble que vous manuellement déroulé une boucle, là.
Le titre est trompeur, car tous les 32 bits sont toujours utilisés dans un int.
Je sais le titre est un peu trompeur, mais je ne sais pas comment l'appeler, si vous avez des suggestions merci de nous l'envoyer et je vais modifier le titre.
Remarque ce sont les mêmes que
log2(value)+1
stackoverflow.com/questions/3305059/...OriginalL'auteur sigvardsen | 2010-05-29
Vous devez vous connecter pour publier un commentaire.
Plus facile?
Si vous êtes à la recherche pour les algorithmes, les responsables de l'implémentation de l'API Java d'accord avec votre divide-and-conquer bitshifting approche:
Modifier: Comme un rappel pour ceux qui ont confiance dans la précision des calculs en virgule flottante, exécuter le test suivant harnais:
La première détection d'un écart:
Bon exemple avec la virgule flottante d'erreur.
OriginalL'auteur meriton
Malheureusement, il n'existe pas de
Integer.bitLength()
méthode qui serait vous donner la réponse directement.Une méthode analogue existe pour
BigInteger
, de sorte que vous pourriez utiliser:De la construction de la
BigInteger
objet sera un peu moins efficace, mais qui ne fera que question si vous le faites plusieurs millions de fois.OriginalL'auteur starblue
Vous voulez calculer le logarithme en base 2 du nombre - à-dire:
Java a de Maths.journal de la méthode qui utilise la base de e, de sorte que vous pouvez faire:
Raisonnablement sûr! Le seul problème est que pour une valeur de 0, lorsque vous vous retrouvez avec négatif infinis et d'autres belles choses 🙂
Un autre problème donné sont des nombres négatifs, le plus grand ensemble de bits.
Vous avez de la chance, les erreurs d'arrondi manifeste qu'au-delà de la gamme de
int
. Cependant, pour0xffffffffffffL
, votre code donnerait le résultat incorrect de 49, au lieu de 48. Je vais ajouter le code de test pour ma réponse.OriginalL'auteur Chris
Attention à ce que vous demandez. Un très rapide de la technique est de faire une table de recherche:
où
bittable
contient une entrée pour chaque type int. Bien sûr qui a des complications pour les valeurs négatives. Un plus pratique serait de compter les bits dans bitfields du nombreOriginalL'auteur wallyk
Vous vraiment voulez juste trouver la position de la plus haute bit à 1. Voir cette page, sous la rubrique "Trouver entier logarithme de base 2 d'un entier (aka la position du bit le plus élevé ensemble)".
OriginalL'auteur Victor Liu
De ici, une façon de le faire avec, juste au niveau du bit et et plus:
OriginalL'auteur Ken
Je pense que l'arrondi log_2 de ce numéro vous donnera ce dont vous avez besoin.
Quelque chose comme:
Je pense que oui. Voir Chris réponse 🙂
OriginalL'auteur Oak
OriginalL'auteur realworldcoder
Si vous êtes à la recherche pour le plus rapide (et sans table, ce qui est certainement plus rapide), c'est probablement l'un:
OriginalL'auteur cyanide
Entier.toBinaryString(valeur).longueur()
OriginalL'auteur Jacob Abraham
Une autre solution est d'utiliser le
length()
d'unBitSet
qui, selon les APID'utiliser le
BitSet
vous avez besoin de créer un tableau. Donc, il n'est pas aussi simple que de commencer avec un purint
. Mais vous sortez de la JDK boîte - testés et pris en charge. Il devrait ressembler à ceci:Appliquée à des exemples dans la question:
Lors de la demande de bits de la
BitSet
me semble être la bonne structure de données.OriginalL'auteur LuCio