У меня есть две строки следующим образом:
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];
}
Любая помощь будет оценена.
Вы пытаетесь 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'
чтобы получить правильный вывод
с ++ имеет 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;
}
Значения ASCII символов «0» и «1» равны 48 и 49.
Чтобы применить XOR к двум символам a, b ∈ {‘0’, ‘1’}, вы можете использовать:
char result = std::abs(a - b) + '0';
Вы 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');