C ++ Преобразование реализации XOR в 8 бит (процессор не поддерживает XOR)

Эта функция используется для вычисления XOR 32-битного целого

int xor32int(int x, int y)
{
int res = 0; // Initialize result

// Assuming 32-bit Integer
for (int i = 31; i >= 0; i--)
{
// Find current bits in x and y
bool b1 = x & (1 << i);
bool b2 = y & (1 << i);

// If both are 1 then 0 else xor is same as OR
bool xoredBit = (b1 & b2) ? 0 : (b1 | b2);

// Update result
res <<= 1;
res |= xoredBit;
}
return res;
}

Это прекрасно работает, когда XOR’овские 8-битные значения, но сначала их нужно привести к int, т.е.

char byte1 = 0x23, byte2 = 0x34;
int result = xor32int((int)byte1, (int)byte2);

И, будучи xor32int() Предполагается, что входные данные равны 32-разрядным целым числам, он запускает цикл 32 раза, поэтому даже если значение равно только 8-разрядному, он запускает дополнительные циклы, когда это не нужно, что приводит к значительному снижению производительности.

Как бы я пошел о преобразовании xor32int() функция, так что она работает только с 8-битными значениями, поэтому не нужно зацикливаться 32 раза?

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

0

Решение

Есть ли причина, по которой вы не можете использовать (x | y) & ~(x & y)? Это одно из определений xor. Вы можете написать это как функцию:

char xor8(char x, char y) {
return (x | y) & ~(x & y);
}

Вы даже можете написать его как шаблон функции:

template<typename T>
T xorT(T x, T y) {
return (x | y) & ~(x & y);
}

Если вы не можете использовать это по какой-то причине, я уверен, что вы можете заменить int с char, а также 31 с 7:

char xor8char(char x, char y)
{
char res = 0;

for (int i = 7; i >= 0; i--)
{
bool b1 = x & (1 << i);
bool b2 = y & (1 << i);

bool xoredBit = (b1 & b2) ? 0 : (b1 | b2);

res <<= 1;
res |= xoredBit;
}
return res;
}

Все это, живи на Колиру.

2

Другие решения

Других решений пока нет …