2015-12-22 7 views
-2

Мне нужно, чтобы каждый отдельный бит в переменной использовался C++ Рассмотрим 4-битные значения a и x, где их битовое представление a = a3a2a1a0 и x = x3x2x1x0. Мы выполняем операцию маскировки "." как a.x = a3x3(xor)a2x2(xor)a1x1(xor)a0x0.Специальная операция маскирования в C++

Я сделал & x и нашел a3x3 a2x2 a1x1 a0x0 сейчас мне нужно их xor, но как? есть ли какой-нибудь особый способ сделать это? как '&' операция? Я искал, но ничего не нашел. Любая помощь будет оценена!

+0

Что 'x3x2x1x0' значит? Я предполагаю, что 'a3a2a1a0' является' 0xA3A2A1A0'. ** Изменить **: получил. – YSC

+0

Оператор для xor является '^'. – Jarod42

+0

[Если вы искали операторов C++] (https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B), вы бы быстро нашли оператору xor ... – Borgleader

ответ

0

Вы 'нужно сдвинуть "a и x", чтобы выполнить xor всех бит.

Что-то вроде:

uint32_t a = 0xa; 
uint32_t x = 0xb; 

uint32_t tmp = a & x;   // Bitwise AND of a and x 
uint32_t res = 0; 
for (int i = 0; i < 32; ++i) 
{ 
    res = res^(0x1 & tmp); // Only include LSB of tmp in the XOR 
    tmp = tmp >> 1;   // Shift tmp to get a new LSB 
} 
cout << "Result: " << res << endl; 

Альтернативным решением может быть:

uint32_t a = 0xa; 
uint32_t x = 0xb; 

uint32_t tmp = a & x;   // Bitwise AND of a and x 
uint32_t res = 0; 
while (tmp > 0) 
{ 
    if ((tmp % 2) == 1) res = (res + 1) & 0x1; // XOR operation 
    tmp = tmp/2;        // Shift operation 
} 
cout << "Result: " << res << endl; 
+0

Большое вам спасибо! – user5670635

1

Основываясь на вашем описании, конечный результат, который вы собираетесь получить, равен 0 или 1, так как вы закончили андинг, вам нужно рассчитать, сколько 1 в двоичном представлении результата ангирования: a & x.

Что вам нужно сделать, это сдвинуть биты, один за другим, и вычислить 1-х, если конечный результат нечетное число, то конечный результат равен 1, если даже тогда конечный результат равен 0.