Получите n наименее значимых битов из набора

Это кажется довольно простым, но я не могу найти ответ. Если у меня есть int X, каков наилучший способ получить N наименее значимых бит из этого int, в Java?

Ответ 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 xx является значением младших 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.

Недостатком этого является то, что вам нужно будет создать маску для каждого бита, поэтому, возможно, это лучше всего рассматривать как другой метод подхода в целом.