c++ - C++ 将 XOR 实现转换为 8 位(处理器不支持 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'ing 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)
?这是异或的一种定义。你可以把它写成一个函数:
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;
}
推荐阅读
- java - 为什么在数据快照中同时执行 if 和 else 语句?
- python - Keras - 如何将图像数组传递给 ImageDataGenerator.flow
- javascript - 如何使用锚标签通过链接打开我安装的应用程序,如下图所示
- kotlin - 如何使用 KTOR 库配置 ssl?
- android - 更改背景颜色后 AppCompatButton 变平
- flutter - 如何使用字符串中的名称显示包中的图标?
- bitmap - MFC 功能区 - 如何更改默认的小位图大小?
- python - 计算两条线之间的角度(2个选项)和效率
- c# - 我想随机选择我之前创建的方法之一
- if-statement - “ROUND”计算不能低于 1.0