Как получить значение бита в определенной позиции из байта? - PullRequest
43 голосов
/ 20 февраля 2012

Если у меня есть байт, как будет выглядеть метод, чтобы получить бит в определенной позиции?

Вот что я знаю, и я не думаю, что это работает.

public byte getBit(int position) {
    return (byte) (ID >> (position - 1));
}

где ID - имя байта, из которого я получаю информацию.

Ответы [ 4 ]

89 голосов
/ 20 февраля 2012
public byte getBit(int position)
{
   return (ID >> position) & 1;
}

Сдвиг вправо ID по позиции приведет к тому, что бит #position окажется в самом дальнем месте справа от номера. Комбинируя это с побитовым AND & с 1, вы узнаете, установлен ли бит.

position = 2
ID = 5 = 0000 0101 (in binary)
ID >> position = 0000 0001

0000 0001 & 0000 0001( 1 in binary ) = 1, because the furthest right bit is set.
8 голосов
/ 20 февраля 2012

Вы хотите сделать битовую маску и сделать побитовую и.В конечном итоге это будет выглядеть очень близко к тому, что у вас есть - используйте shift для установки соответствующего бита, используйте & для выполнения побитовой операции.

So

 return ((byte)ID) & (0x01 << pos) ;

где pos должен находиться в диапазоне от 0 до 7. Если у вас есть младший значащий бит как «бит 1», тогда вам нужен -1, но я бы рекомендовал против этого - такой тип изменения позиции всегда является источником ошибок дляя.

1 голос
/ 05 июня 2018

В Java хорошо работает следующее:

if (value << ~x < 0) {
   // xth bit set
} else {
   // xth bit not set
}

value и x могут быть int или long (и не обязательно должны быть одинаковыми).

Предостережение для не-Java-программистов : предыдущее выражение работает в Java, потому что на этом языке операторы сдвига бит применяются только к 5 (или 6, в случае long) младшим битамправого операнда.Это неявно переводит выражение в value << (~x & 31) (или value << (~x & 63), если value равно long).

Javascript : оно также работает в javascript (как java, только самый низкийПрименяется 5 битов числа смен).В javascript любой number является 32-битным.

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

1 голос
/ 14 января 2018

для получения n-го бита в целых числах

 return ((num >> (n-1)) & 1);
...