Эта функция используется для вычисления 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.
Есть ли причина, по которой вы не можете использовать (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;
}
Других решений пока нет …