С++ конвертировать реализацию XOR в 8-битную (процессор не поддерживает XOR)

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


person Power5    schedule 28.10.2018    source источник
comment
у вас есть оператор &, но нет ^? не уверен, что понимаю проблему   -  person OznOg    schedule 28.10.2018
comment
@OznOg Да, некоторые процессоры не поддерживают XOR, но поддерживают AND, OR и т. д. Но это не вопрос. Этот вопрос просто спрашивает, как мне взять функцию xor32int() и изменить ее, чтобы она предполагала 8-битный ввод, а не 32-битный ввод.   -  person Power5    schedule 28.10.2018
comment
Нельзя ли просто изменить 31 на 7? (также лучше использовать типы unsigned с битовыми манипуляциями)   -  person Galik    schedule 28.10.2018


Ответы (1)


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

person Nelfeal    schedule 28.10.2018