Вопрос битовой операции - PullRequest
       64

Вопрос битовой операции

1 голос
/ 05 ноября 2010

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

Я покажу, что я хочу, используя примеры.Обратите внимание, что длина каждой битовой строки не имеет значения:

1)

100000
100000
------
011111

2)

000000
000000
------
000000

3)

100000
000000
------
000000

4)

000100
000100
------
111011

5)

100100
100100
------
011011

6)

100100
000100
------
111011

7)

010101
101010
------
000000

8)

111111
111111
------
000000

Итак, идея в том, что если где-нибудь в первой строке 1 перекрывается с 1 во второй строке, то в результате 1 появляются везде, кроме позиции, где перекрываются 1.

Ответы [ 4 ]

2 голосов
/ 05 ноября 2010

Вы можете использовать побитовое nand, то есть побитовое И , с отрицанием, чтобы получить все, кроме случаев 2, 3 и 7.

Если вам абсолютно необходимы эти два случая, вы можете сделать

result = a & b;        // Bitwise and of the two inputs
if (result != 0) {     // If we have no matches, we want it to stay 0.
    result = ~result;
} 

Однако, если вы сделаете это, вы должны понимать, что у вас нет способа отличить дело 2/3/7 от дела 8.

2 голосов
/ 05 ноября 2010

Псевдокод:

if (a & b)
    return ~(a & b)
else
    return 0
0 голосов
/ 05 января 2012

IIRC, один надежный способ сделать такое преобразование, то есть из имеющихся у вас данных результата операции в цифровую логику, называется «Карта Карно», т.е. вы начинаете с данных, называемых «Таблицей правды», и в итоге получаете необходимыецифровая логикаКонечно, из этого вы можете конвертировать в любой язык программирования, учитывая специфичные для языка побитовые операторы / соглашения.

0 голосов
/ 05 ноября 2010

вам нужна одна операция для всего списка битов, или вы можете перебирать одну битовую пару одну за другой?если это так, это тривиально, если нет, я считаю, что есть булева двоичная функция, которая делает это точно (среди 16 из них)

...