Восстановление значения из массива битов - PullRequest
2 голосов
/ 28 апреля 2011

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

Как мне вставить бит на стороне LSB и одновременно сдвинуть его?

Ответы [ 2 ]

5 голосов
/ 28 апреля 2011

Вы бы сделали что-то вроде этого:

bool yourarray[32];
int output = 0;

for(int i = 0; i < 32; i++)
{
    // Shift the bits left by 1. The first time through the loop this
    // will have no real effect since 0 << 1 == 0.
    output <<= 1;

    // If this particular bit is "on", activate the LSB using a bitwise-or
    if(yourarray[i] == true)
        output |= 1; // this turns on the LSB

    // We could also do this for completeness, but it has no effect since
    // the LSB is already 0:
    else
        output &= ~1; // this turns off the LSB
}

Я предполагаю, что здесь int размером 32.

Есть и другие соображения, которые необходимо учитывать, например endianness но это должно дать вам представление.Также остерегайтесь проблем с подписью, так как в этом случае старший (самый левый) бит будет влиять на положительный или отрицательный тип int.

1 голос
/ 28 апреля 2011

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

Допустим, у нас есть 1-байтовое (8-битное) значение: val1 = 00000011. И у нас есть еще одно 1-байтовое значение: val2 = 00100001

Если мы сдвинем биты val1 влево 2, примерно так:

val1 = val1 << 2;

val1 теперь выглядит так: 00001100.

Тогда, если мы ИЛИ (|) val2 с val1 следующим образом:

val1 = val1 | val2

val1 будет выглядеть так: 00101101.

Надеюсь, это поможет ^ _ ^

...