C ++ Преобразование реализации XOR в 8 бит (процессор не поддерживает XOR) - PullRequest
0 голосов
/ 28 октября 2018

Эта функция используется для вычисления 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.

1 Ответ

0 голосов
/ 28 октября 2018

Есть ли причина, по которой вы не можете использовать (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;
}

Все это, живите на Coliru.

...