Cela semble assez simple, mais je ne trouve pas de réponse. Si j’ai un int X, quel est le meilleur moyen d’obtenir N bits les moins significatifs de cet int, en Java?
Cela devrait fonctionner pour tous les N < 33 32 non négatifs.
x & ((1 << N) - 1)
Cela vaut la peine de préciser comment cela fonctionne pour N == 31
et . Pour N == 32
N == 31
, on obtient 1 << N == Integer.MIN_VALUE
. Lorsque vous soustrayez 1 à cela, Java Integer.MAX_VALUE
silencieusement à Integer.MAX_VALUE
, ce qui est exactement ce dont vous avez besoin. Pour N == 32
, le bit 1 est complètement décalé, donc 1 << N == 0
;then (1 << N) - 1 == -1
, ce qui correspond à l'ensemble des 32 bits.
Pour N == 32
, malheureusement, cela ne fonctionne pas car (merci, @zssortingng!), L'opérateur <<
ne se déplace que par le côté droit du mod 32. Si vous souhaitez éviter de tester spécialement ce cas, vous pouvez utiliser:
x & ((int)(1L << N) - 1)
En décalant d'un long
, vous obtenez le décalage complet de 32 bits, ce qui, après avoir rétabli un int
, vous donne 0. La soustraction de 1 vous donne -1 et x & -1
n'est que x
pour toute valeur int
x
(et x
est la valeur des 32 bits inférieurs de x
).
L’approche de Ted est susceptible d’être plus rapide mais voici une autre approche
x << -N >>> -N
Ce décalage tout le bit en haut et en bas pour couper les bits supérieurs.
int i = -1; System.out.println(Integer.toBinarySsortingng(i)); i = i << -5 >>> -5; System.out.println(Integer.toBinarySsortingng(i));
empreintes
11111111111111111111111111111111 11111
Vous pouvez également utiliser un masque. Si vous utilisez l’opérateur & bitwise, vous pouvez alors supprimer le bit que vous souhaitez supprimer (par exemple, les x bits les plus élevés);
int mask = 0x7FFFFFFF //Example mask where you will remove the // most significant bit // (0x7 = 0111b and 0xF = 1111b). int result = numberToProcess & mask; //And apply the mask with the &bitwise op.
L’inconvénient à cela est que vous devrez créer un masque pour chaque bit, c’est peut-être mieux vu comme une autre méthode d’approche en général.