Побитовые операции

Рейтинг: 0Ответов: 1Опубликовано: 28.02.2015

Имеется поле с размером 3 байта. Нужно вычислить значения с 0 бита по 9 бит, потом 2 байт c 10 по 18, и (3 байт) нужно c 19 по 22. Также 23 бит не используется, и он равен нулю.

Не могу сообразить, как сделать маску вида

mask = 0x0(xx - с 0 по 9)000

Единственное, что мне остается, - просто сделать сдвиг (level = (value & mask) >> 8).

Ответы

▲ 2Принят

Начнем с того, что маску вы себе представляете неправильно, т.к. биты индексируются справа налево. Т.е. 0-ой бит, это самый правый бит, а значит сдвигать биты нужно влево.

Для простоты приведу наивный вариант получения маски, чтобы было понятнее, как это происходит по шагам:

   public static int buildMask(int n) {
        int mask = 0;
        for (int i = 0; i < n; i++) {
            mask |= 1 << i;
        }
        return mask;
    }

Если присмотреться внимательно к получившимся маскам, то можно заметить, что маска всегда равна числу со включенным n-ым битом минус 1, т.е.:

int mask = (1 << n) - 1;

Подумайте что будет, если таким образом попробовать сгенерировать маску для всех 32 включенных битов.

Этого более чем достаточно для решения вашей задачи.