Это кажется довольно простым, но я не могу найти ответ. Если у меня есть int X, каков наилучший способ получить N наименее значимых бит из этого int, в Java?
Получите n наименее значимых битов из набора
Ответ 1
Это должно работать для всех неотрицательных N < 33 32:
x & ((1 << N) - 1)
Стоит рассказать о том, как это работает для N == 31
и . Для N == 32
N == 31
получаем 1 << N == Integer.MIN_VALUE
. Когда вы вычитаете 1 из этого, Java молча обертывается до Integer.MAX_VALUE
, что именно то, что вам нужно. Для N == 32
1 бит полностью сдвинут, поэтому 1 << N == 0
; затем (1 << N) - 1 == -1
, который содержит все 32 бита.
Для N == 32
это, к сожалению, не работает, потому что (спасибо, @zstring!) оператор <<
сдвигается только по правому модулю 32. Вместо этого, если вы хотите избежать тестирования для этого случая специально, может использовать:
x & ((int)(1L << N) - 1)
Переместив a long
, вы получите полный 32-битный сдвиг, который после возврата к int
получает вас. Вычитание 1 дает вам -1 и x & -1
всего лишь x
для любое значение int
x
(и x
является значением младших 32 бит x
).
Ответ 2
Тед-подход, вероятно, будет быстрее, но вот еще один подход
x << -N >>> -N
Это сдвинет все бит вверх, а затем вниз, чтобы отрубить верхние биты.
int i = -1;
System.out.println(Integer.toBinaryString(i));
i = i << -5 >>> -5;
System.out.println(Integer.toBinaryString(i));
печатает
11111111111111111111111111111111
11111
Ответ 3
Вы также можете использовать маску. Если вы используете побитовый оператор, вы можете удалить любой бит, который вы хотите удалить (например, самые высокие биты x);
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.
Недостатком этого является то, что вам нужно будет создать маску для каждого бита, поэтому, возможно, это лучше всего рассматривать как другой метод подхода в целом.