au niveau du bit le plus significatif de bit
Je veux trouver le bit le plus significatif est définie à 1
. J'ai essayé tous les moyens possibles à partir de &
à ORing tous les bits de 1
à 31
et ça ne fonctionne pas.
Comme si 1000000
je voudrais avoir 7
.
Qu'avez-vous essayer dans le détail? Quel a été le résultat?
Est-ce devoirs?
J'ai fait toute la count += 1&(~x >> 1-31); et il m'a donné des numéros différents que ce que j'attend, je veux le bit le plus significatif à 1 et c'est tout
Comment doit-nombres négatifs-elle être traitée?
N'a pas d'importance j'ai besoin de le bit le plus significatif c'est 1 c'est tout. donc, même si j'ai -2 j'ai encore besoin de le bit le plus significatif avec le 1
Est-ce devoirs?
J'ai fait toute la count += 1&(~x >> 1-31); et il m'a donné des numéros différents que ce que j'attend, je veux le bit le plus significatif à 1 et c'est tout
Comment doit-nombres négatifs-elle être traitée?
N'a pas d'importance j'ai besoin de le bit le plus significatif c'est 1 c'est tout. donc, même si j'ai -2 j'ai encore besoin de le bit le plus significatif avec le 1
OriginalL'auteur mkuk | 2012-02-02
Vous devez vous connecter pour publier un commentaire.
Si vous insistez sur l'utilisation directe des opérateurs au niveau du bit, vous pouvez essayer quelque chose comme ceci:
Nous initialisons le masque de
1 << 31
parce que cela représente un 1 suivi par 31 0. Nous utilisons cette valeur à tester si l'indice 31 (la 32e place) est à 1. Lorsque nousand
cette valeur avecmyInt
, nous obtenons un 0, sauf si le bit correspondant est mis enmyInt
. Si c'est le cas, nous sommes de retour quebitIndex
. Si non, alors on décale le masque de la droite par 1 et essayez de nouveau. Nous répétez jusqu'à ce que nous sommes à court d'endroits pour changer, auquel cas cela signifie aucun des bits étaient ensemble (peut-être que vous souhaitez lancer une exception ici, au lieu de retourner -1).Noter que ce sera le retour de la valeur
0
pour1
et6
pour64
(1000000
en binaire). Vous pouvez régler que si vous préférez. Notez également que j'ai utilisé le non signé à droite de l'opérateur plutôt que de la signature de décalage à droite. C'est parce que le but ici est de traiter les raw bits plutôt que de leur signature à l'interprétation, mais il n'a pas d'importance dans ce cas étant donné que toutes les valeurs négatives se termine dans la première itération de la boucle, avant de passer se produit.myInt
est pas négatif, alors vous aurez besoin de majmask
et il commence comme une valeur négative.Vous avez raison que
mask
aura toujours l'un des principaux 1 qui n'appartiennent pas si l'signé la touche maj droite est utilisée (carmask
commence comme négatif). Toutefois, cela n'affecte pas les résultats de ma mise en œuvre parce que quandmyInt
n'est pas négatif, que le superflu de 1 bit est toujoursand
ed avec un 0 (le bit de signe demyInt
, qui nous a été positive).Bon point! Je n'avais pas travaillé par les conséquences de la présence de pointe 1s en
mask
, qui (comme vous le soulignez) sont justement rien.OriginalL'auteur Michael McGowan
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#numberOfLeadingZeros%28int%29
Vous voulez quelque chose comme
32 - Integer.numberOfLeadingZeros(value)
.Cela devrait faire ce que vous voulez. Avez-vous essayé?
OriginalL'auteur zch
Si il n'y est une réponse acceptée, j'ai une autre façons de partager ce qui, je pense est plus facile.
Si vous souhaitez utiliser des opérations bit à bit, voici le chemin. En gros, je suis en droit de décalage de l'entier jusqu'à devenir nulle. Aucun masque n'est requis.
Une autre façon est de calculer mathématiquement:
OriginalL'auteur Adrian Shum
Les meilleurs de la mise en œuvre, je suis venu à travers trois itérations et une table de recherche.
OriginalL'auteur JJWalker
Successive approximation de minimiser les itérations à cinq boucles:
OriginalL'auteur D Lindsey
Pas le plus efficace, peut-être, mais cela devrait fonctionner::
OriginalL'auteur Ted Hopp
Suffit d'utiliser numberOfTrailingZeros(valeur) méthode de Longue ou de la classe Integer.
OriginalL'auteur quit
Pour Little Endian format:
OriginalL'auteur Bavithra Thangaraj
Juste pour ajouter une autre approche
int
plutôt qu'unbyte
.oui merci
Je ne pense pas que votre point de départ est correcte. Ce code donne la même réponse pour
Integer.MAX_VALUE
comme il le fait pour les nombres négatifs.OriginalL'auteur Johan Sjöberg
OriginalL'auteur user1185840