Je veux trouver le bit le plus significatif qui est défini sur Comme si 1 code>. J'ai essayé toutes les tâches possibles à partir de
& code> pour oriser tous les bits à partir de
1 code> à
31 code> et cela ne fonctionne pas. P>
1000000 code> J'aimerais avoir
7 code>. p>
10 Réponses :
http://docs.oracle .Com / Javase / 1.5.0 / Docs / API / Java / Lang / INTEGER.HTML # NuméroFleadingzeros% 28Int% 29
Vous voulez quelque chose comme 32 - integer.numberfleadingzeros (valeur) code>. P>
if( value | 0x40 ) return 7; else if( value | 0x20 ) return 6; else if( value | 0x10 ) return 5; else if( value | 0x8 ) return 4; else if( value | 0x4 ) return 3; else if( value | 0x2 ) return 2; else if( value | 0x1 ) return 1;
Qu'est-il arrivé de revenir 8 à 31?
Pas le plus efficace, peut-être, mais cela devrait fonctionner:
Non, juste non. Oui ça marche, mais j'ai-t-il gaspillé.
juste pour ajouter une autre approche
Vous voulez probablement saisir un int code> plutôt qu'un
octet code>.
Je ne pense pas que votre point de départ est correct. Ce code donne la même réponse pour integer.max_value code> comme pour les nombres négatifs.
Si vous insistez sur directement à l'aide des opérateurs bitwises, vous pouvez essayer quelque chose comme ceci: Nous initialisons le masque à Notez que cela reviendra La valeur 1 << 31 code> parce que cela représente un 1 suivi de 31 0. Nous utilisons cette valeur pour tester si l'index 31 (32e Spot) est un 1. Lorsque nous
et CODE> cette valeur avec
Myint code>, nous obtenons un 0 si le bit correspondant est défini dans
myint code>. Si tel est le cas, nous retournons que
bitindex code>. Sinon, alors nous déplacons le masque à droite par 1 et essayez à nouveau. Nous répétons que nous manquons de lieux de décalage, auquel cas cela signifie qu'aucun des bits n'a été défini (peut-être que vous souhaitez lancer une exception ici au lieu de retourner -1). P>
0 code> pour
1 code> et
6 code> pour
64 code> (
1000000 code> en binaire). Vous pouvez ajuster que si vous préférez. Notez également que j'ai utilisé l'opérateur droit non signé plutôt que le changement de droite signé. C'est parce que l'intention ici est de traiter des bits brutes plutôt que de leur interprétation signée, mais peu importe dans ce cas, car toutes les valeurs négatives se termineront dans la première itération de la boucle avant de se déplacer. P> p>
En fait, l'utilisation de l'opérateur de changement de droite non signé est importante. Si myint code> est pas i> négatif, vous devrez alors déplacer
masque code> et il démarre comme une valeur négative.
Vous avez raison que masque code> aura toujours un 1 dirigeant qui n'appartient pas si le changement de droite signé est utilisé (car
masque code> commence comme négatif). Cependant, cela n'affecte pas les résultats de ma mise en œuvre car lorsque
myint code> n'est pas négatif, ce 1 bit superflu est toujours en train d'être
et code> avec un 0 (c.-à-d. Le bit des signes de
myint code>, que nous venons de dire était positif).
Bon point! Je n'avais pas travaillé à travers les conséquences d'avoir conduit 1s dans masque code>, qui (comme vous le soulignez) ne sont pas précisément rien.
L'approximation successive minimisera les itérations à cinq boucles:
Bien qu'il y ait une réponse acceptée, j'ai un autre moyen de partager, ce que je pense est plus facile.
Si vous souhaitez utiliser des opérations bitwises, voici la voie. Fondamentalement, je suis en train de changer l'entier jusqu'à ce qu'il soit zéro. Aucun masque n'est requis. p>
private static int mostSignificantBit(int myInt){ if (myInt == 0) return 0; // special handling for 0 if (myInt < 0) return 32; // special handling for -ve return (int)(Math.log(myInt)/Math.log(2)) +1; }
La mise en œuvre slickest que j'ai rencontrée - trois itérations et une recherche de table.
unsigned int msb32(unsigned int x) { static const unsigned int bval[] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; unsigned int base = 0; if (x & 0xFFFF0000) { base += 32/2; x >>= 32/2; } if (x & 0x0000FF00) { base += 32/4; x >>= 32/4; } if (x & 0x000000F0) { base += 32/8; x >>= 32/8; } return base + bval[x]; }
Utilisez simplement la méthode NumberOtTrarsezeros (valeur) de classe longue ou entière. p>
pour le petit format Endian:
((yourByte & yourBitMask) >> msbIndex) && 0x01
Qu'avez-vous essayé en détail? Quel était le résultat?
J'ai fait tout le comte + = 1 & (~ x >> 1-31); et cela m'a donné des nombres différents de ce que je m'attendais à vouloir le bit le plus significatif qui soit 1 et c'est ça
Comment les nombres négatifs devraient-ils être traités?
Peu importe j'ai besoin du bit le plus significatif qui soit 1 c'est tout. Donc, même si j'ai -2, j'ai encore besoin du bit le plus significatif avec le 1