Как пройти каждый бит байта - PullRequest
5 голосов
/ 17 декабря 2010

Я не знаю, как реализовать следующий алгоритм.

Например, у меня int = 26, это «11010» в двоичном виде. Теперь мне нужно реализовать одну операцию для 1, другую для 0, слева направо, до конца байта. Но я действительно понятия не имею, как это реализовать. Может быть, я могу преобразовать двоичный массив в массив символов, но я не знаю, как. Кстати, int равно 26 только в примере, в приложении это будет случайным.

Ответы [ 6 ]

9 голосов
/ 17 декабря 2010

Так как вы хотите перейти «слева направо»:

unsigned char val = 26;  // or whatever

unsigned int mask;

for (mask = 0x80; mask != 0; mask >>= 1) {

    if (val & mask) {
        // bit is 1
    }
    else {
        // bit is 0
    }
}

Цикл for просто проходит каждый бит в байте от старшего к младшему.

4 голосов
/ 17 декабря 2010

Вы можете использовать арифметику по модулю или битовую маску, чтобы получить то, что вам нужно.

Арифметика по модулю:

int x = 0b100101;
// First bit
(x >> 0) % 2; // 1
// Second bit
(x >> 1) % 2; // 0
// Third bit
(x >> 2) % 2; // 1
...
etc.

Битовая маскировка

int x = 0b100101;
int mask = 0x01;
// First bit 
((mask << 0) & x) ? 1 : 0
// Second bit
((mask << 1) & x) ? 1 : 0
...
etc.
3 голосов
/ 29 июля 2015

Я использую эту опцию:

isBitSet = ((bits & 1) == 1);
bits = bits >> 1

Я нахожу ответ также в stackoverflow:

Как правильно перебрать и распечатать биты Int, Long, Float или BigInteger?

2 голосов
/ 17 декабря 2010

В языках C, C ++ и аналогичного синтаксиса вы можете определить, равен ли самый правый бит в целом числе i 1 или 0, изучив, является ли i & 1 ненулевым или нулевым.(Обратите внимание, что это единственная &, обозначающая побитовую операцию И, а не &&, обозначающая логическое И.) Для второго бита справа вы проверяете i & 2;для третьего вы проверяете i & 4 и т. д. степенями два.

В общем, чтобы определить, равен ли бит, который j th справа, равен нулю, вы можете проверить, равен ли i & (1 << (j-1)) != 0.<< обозначает сдвиг влево;1 << (j-1) по существу эквивалентно 2 j-1 .

Таким образом, для 32-разрядного целого числа ваш цикл будет выглядеть примерно так:

unsigned int i = 26;  /* Replace this with however it's actually defined.  */

int j;
for (j = 31; j >= 0; j--)
{
  if ((i & (1 << (j-1))) != 0)
    /* do something for jth bit is 1 */
  else
    /* do something for jth bit is 0 */
}

Надеюсь, этого достаточно, чтобы вы начали.

0 голосов
/ 17 декабря 2010

Привет. Посмотрите вверх, бит сдвигается, побитовый и.

0 голосов
/ 17 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...