此函数用于计算32位整数的XOR
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;
}
当对8位值进行XOR运算时,这很好用,但首先需要将它们强制转换为int,即
char byte1 = 0x23, byte2 = 0x34;
int result = xor32int((int)byte1, (int)byte2);
由于xor32int()
假设输入为32位整数,因此它会运行32次循环,因此即使值只有8位,它也会在不必要时运行额外的循环,从而导致性能大幅下降。
我将如何转换xor32int()
函数,使其仅适用于8位值,因此不需要循环32次?
如果您想知道为什么不简单地使用XOR运算符,那是因为我正在使用的旧计算机使用的处理器不支持XOR。
答案 0 :(得分:2)
您有不能使用(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;
}