【问题标题】:C++ Convert XOR Implementation To 8 Bit (Processor Doesn't Support XOR)C++ 将 XOR 实现转换为 8 位(处理器不支持 XOR)
【发布时间】:2018-10-28 10:48:47
【问题描述】:

该函数用于计算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;
}

这在对 8 位值进行异或运算时可以正常工作,但首先需要将它们强制转换为 int,即

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

由于xor32int() 假定输入为 32 位整数,它会运行 32 次循环,因此即使值只有 8 位,它也会在不必要时运行额外的循环,从而导致性能大幅下降。

我将如何转换 xor32int() 函数,使其仅适用于 8 位值,因此不需要循环 32 次?

如果您想知道我为什么不简单地使用 XOR 运算符,那是因为我正在使用一台旧机器,它使用不支持 XOR 的处理器。

【问题讨论】:

  • 你有 & 运算符但没有 ^ ?不确定我是否理解问题
  • @OznOg 是的,某些 CPU 不支持 XOR,但它们支持 AND、OR 等。但这不是问题所在。这个问题只是询问我将如何使用xor32int() 函数并对其进行更改,使其假定为 8 位输入而不是 32 位输入。
  • 你不能把31改成7吗? (也最好使用带有位操作的 unsigned 类型)

标签: c++ xor 32-bit 8-bit


【解决方案1】:

您是否有不能使用(x | y) &amp; ~(x &amp; 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);
}

如果你因为某种原因不能使用它,我很确定你可以用char替换int,用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;
}

All of that, live on Coliru.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2016-01-01
    • 2013-10-10
    • 2011-08-25
    相关资源
    最近更新 更多