2016-09-08 11 views
2

У меня есть две строки следующим образом:XOR двух двоичных строк C++

STRING1 :  011011110011000 

STRING2 :  011001000001000 

EXPECTED OUTPUT : 000010110010000 

Однако, когда я пытаюсь XOR их (побитовое), используя следующий код, выход пустым. Код:

for(int i = 0; i<15; i++) 
{ 
    final_key[i] = STRING1[i]^STRING2[i]; 
    cout<<" XOR = "<<final_key[i]; 
} 

Любая помощь будет принята с благодарностью.

ответ

6

Вы пытаетесь XOR 2 char за раз. Попробуйте вместо этого:

final_key[i] = ((STRING1[i]-'0')^(STRING2[i]-'0')) + '0'; 

Объяснение

См here для значений ASCII.

Значение ASCII для '0' составляет 48, а значение ASCII из '1' составляет 49. 48^49 является 1, 48^48 и 49^49 0. Это будет возвращать значение 0 или 1 в char, который будет стоять либо EOF char (если он равен 0) или char SOH (если он один), ни один из которых не выводится правильно.

Таким образом, вы должны преобразовать каждый char в бит (0 или 1) перед проведением операции XOR. Таким образом, вы можете вычесть '0' из каждого char, чтобы получить numrical значение цифры, провести операцию XOR, а затем добавить обратно '0', чтобы получить соответствующий выходной

+0

Ваше решение работает. Я приму это, как только смогу. Любое объяснение (если возможно). –

+5

Просто подумал, что я бы указал на упрощение. Поскольку 48^49 = 1 и 48^48 = 49^49 = 0, на самом деле не нужно вычитать '0 '' от каждого входного символа. Необходимо добавить «0» к результату. –

+0

Да, я просто понял, что другие ответы также являются отличными ярлыками, которые я понятия не имел. –

2

Значения ASCII из символов «0» и «1» являются 48 и 49. Для применения XOR на двух символов а, Ь ∈ { '0', '1'} вы можете использовать:

char result = std::abs(a - b) + '0'; 
3

C++ имеет std::bitset<>

#incude <string> 
#incude <bitset> 
#incude <iostream> 

int main() 
{ 
    std::string s1 = "010101010101010101"; 
    std::string s2 = "101010101000001111"; 

    auto result = std::bitset<32>(s1)^std::bitset<32>(s2); 
    std::cout << result << std::endl; 
} 
+0

Этот код вызывает следующую ошибку: 'result' не указывает тип auto result = std :: bitset <32> (s1)^std :: bitset <32> (s2); –

+0

Вы скомпилированы с флагом -std = C++ 11? Если нет, вам нужно явно указать возвращаемый тип. –

+0

Хорошо. Спасибо. –

0

вы XORing символы. Это w orks, но вы сохраняете результат так, как он есть, не преобразовывая результат в символ.

string s1="011011110011000"; 
string s2="011001000001000"; 
char final_key[15]; 
for(int i = 0; i<15; i++) 
{ 
final_key[i] = (s1[i]^s2[i])+'0'; //paranthesis is important 
cout<<final_key[i]; 
} 

Вы можете также проверить, является ли s1[i] не равна s2[i], то результатом является 1

final_key[i]=(s1[i]!=s2[i]?'1':'0');