2010-12-16 2 views
4

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

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

+1

http://stackoverflow.com/questions/224799/bitwise-flags-abandoned – 2010-12-16 21:23:07

ответ

0

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

4

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

Modulo арифметика:

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

Bitmasking

int x = 0b100101; 
int mask = 0x01; 
// First bit 
((mask << 0) & x) ? 1 : 0 
// Second bit 
((mask << 1) & x) ? 1 : 0 
... 
etc. 
0

Привет Посмотрите немного сдвигая и побитовое и.

2

В языках 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

Это не константа 26, это было только, к примеру. – revolt 2010-12-16 21:34:59

+0

Я должен был быть более ясным - я назначил «i = 26» в своем коде в качестве примера, следующего за вашим примером; Я бы предположил, что вы определите его каким-то другим способом. Я уточню. – 2010-12-16 21:37:02

7

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

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 просто проходит тщательный каждый бит в байте, от самого старшего бита к наименее.

Смежные вопросы