Подтвердить что ты не робот

Как сделать бит мудрым XOR в C

Я пытаюсь войти в программирование на С, и мне трудно писать побитую функцию XOR только с операторами ~ и &. Пример: bitXor(4, 5) = 1. Как я могу достичь этого?

Пока у меня есть это:

int bitXor(int x, int y) {

    return z;
}
4b9b3361

Ответ 1

Хорошо, подумайте об этом. Что делает XOR?

x   y    XOR
------------
0   0     0
1   0     1
0   1     1
1   1     0

Итак, как мы превращаем это в функцию? Подумайте об AND и обратном порядке AND (~ x & ~ y) (это, как правило, NOR):

              (~x&~y)
 x   y   AND    NOR   
 ---------------------
 0 & 0  = 0      1    
 1 & 0  = 0      0 
 0 & 1  = 0      0
 1 & 1  = 1      0

Посмотрев на эти два выхода, это довольно близко, все, что нам нужно сделать, это просто NOR два предыдущих выхода (x AND y) (x NOR y), и у нас будет решение!

  (a)       (b)    ( a NOR b )
x AND y   x NOR y    ~a & ~b
-------------------------------
   0         1          0
   0         0          1
   0         0          1
   1         0          0

Теперь просто напишите это:

a = ( x & y )
b = ( ~x & ~y )
XOR'd result = (~a & ~b)

BINGO! Теперь просто напишите это в функцию

int bitXor(int x, int y) 
{
    int a = x & y;
    int b = ~x & ~y;
    int z = ~a & ~b;
    return z;
}     

Ответ 2

Использование NAND логика:

int bitNand(int x, int y)
{
    return ~ (x & y);
}

int bitXor(int x, int y)
{
    return bitNand( bitNand(x, bitNand(x, y)),
                    bitNand(y, bitNand(x, y)) );
}

Или:

int bitXor(int x, int y)
{
    return ~( (x & y) | (~x & ~y) );
}

Или:

int bitXor(int x, int y)
{
    return (x & ~y) | (~x & y);
}

Конечно, это проще:

int bitXor(int x, int y)
{
    return x ^ y;
}

Ответ 3

Нетрудно видеть, что

x ^ y = (x | y) & ~(x & y)

поэтому остается выразить | только & и ~. Законы Де Моргана говорят нам

x | y = ~(~x & ~y)

Ответ 4

Я хочу, чтобы он записывал его только с помощью ~ и &

Это относится к воротам NAND, верно? Изучив эту схему :

int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));

То же самое относится к небитовому, i. е. логически, просто замените ! вместо ~.

Ответ 5

Вы можете выполнить побитовое XOR-операцию в c с помощью оператора ^.

Ответ 6

int bitXor(int x, int y) {
  return ~(~(~x & y) & ~(x & ~y));
}

объяснение:

x ^ y = (~x & y) | (x & ~y) = ~(~(~x & y) & ~(x & ~y))

Последняя процедура использует законы де Моргана

Ответ 7

int xorro(a, b)
{
    if (a == b)
        return 0;
    return 1; 
}