Я пытаюсь войти в программирование на С, и мне трудно писать побитую функцию XOR только с операторами ~
и &
. Пример: bitXor(4, 5) = 1
. Как я могу достичь этого?
Пока у меня есть это:
int bitXor(int x, int y) {
return z;
}
Я пытаюсь войти в программирование на С, и мне трудно писать побитую функцию XOR только с операторами ~
и &
. Пример: bitXor(4, 5) = 1
. Как я могу достичь этого?
Пока у меня есть это:
int bitXor(int x, int y) {
return z;
}
Хорошо, подумайте об этом. Что делает 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;
}
Использование 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;
}
Нетрудно видеть, что
x ^ y = (x | y) & ~(x & y)
поэтому остается выразить |
только &
и ~
. Законы Де Моргана говорят нам
x | y = ~(~x & ~y)
Я хочу, чтобы он записывал его только с помощью ~ и &
Это относится к воротам NAND, верно? Изучив эту схему :
int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));
То же самое относится к небитовому, i. е. логически, просто замените !
вместо ~
.
Вы можете выполнить побитовое XOR-операцию в c с помощью оператора ^
.
int bitXor(int x, int y) {
return ~(~(~x & y) & ~(x & ~y));
}
объяснение:
x ^ y = (~x & y) | (x & ~y) = ~(~(~x & y) & ~(x & ~y))
Последняя процедура использует законы де Моргана
int xorro(a, b)
{
if (a == b)
return 0;
return 1;
}