Переполнение стека двоичных строк в XOR

У меня есть две строки следующим образом:

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];
}

Любая помощь будет оценена.

2

Решение

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

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

объяснение

Ссылаться на Вот для значений ASCII.

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

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

6

Другие решения

с ++ имеет 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;
}
3

Значения ASCII символов «0» и «1» равны 48 и 49.
Чтобы применить XOR к двум символам a, b ∈ {‘0’, ‘1’}, вы можете использовать:

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

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

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');
0