C++ 异或两个二进制字符串c++;

C++ 异或两个二进制字符串c++;,c++,xor,bitwise-xor,C++,Xor,Bitwise Xor,我有两个字符串,如下所示: STRING1 : 011011110011000 STRING2 : 011001000001000 EXPECTED OUTPUT : 000010110010000 但是,当我尝试使用以下代码对它们进行异或运算(按位)时,输出为空。 代码: for(int i=0;i您试图一次对2char进行异或运算。请尝试: final_key[i] = ((STRING1[i]-'0') ^ (STRING2[i]-'0')) + '0

我有两个字符串,如下所示:

STRING1  :        011011110011000

STRING2  :        011001000001000

EXPECTED OUTPUT : 000010110010000
但是,当我尝试使用以下代码对它们进行异或运算(按位)时,输出为空。 代码:


for(int i=0;i您试图一次对2
char
进行异或运算。请尝试:

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

有关ASCII值,请参阅

'0'
的ASCII值为48,
'1'
的ASCII值为49。
48^49
为1,
48^48
49^49
为0。这会将值0或1返回到
char
,表示
EOF
char(如果为0)或
SOH
char(如果为1),两者都不能正确输出


因此,您需要将每个
字符
转换为位(0或1)在进行异或运算之前。因此,您可以从每个字符中减去
'0'
,以获得数字的数值,执行异或运算,然后加回
'0'
,以获得正确的输出字符“0”和“1”的ASCII值分别为48和49。 对两个字符a、b应用异或∈ {0',1'}您可以使用:

char result = std::abs(a - b) + '0';
c++具有
std::位集

#包括
#包含
#包含
int main()
{
std::string s1=“010101010101”;
std::string s2=“10101010100000111”;
自动结果=标准::位集(s1)^标准::位集(s2);

std::cout您正在对字符进行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];
}
string字符串\u xor(字符串s,字符串t){
字符串res=“”;
对于(int i=0;i

希望这有帮助。

对于不同大小的字符串会更好。:)

字符串异或(字符串a、字符串b){
ll la=a.长度();
ll lb=b.长度();
字符串X;
X=(la>lb)?a:b;
lli=(la>lb)?la-1:lb-1,j=(lalb?la-1:lb-1);
对于(;i>=0,j>=0;i--,j--,x--){
X[X]=(la>lb)?(a[i]^b[j])+'0':(b[i]^a[j])+'0';
}
返回X;
} 

您的解决方案有效。我会尽快接受。是否有任何解释(如果可能)。我只是想指出一个简化。由于48^49=1和48^48=49^49=0,实际上没有必要从每个输入字符中减去
'0'
。只需要在结果中添加
'0'
。是的,我刚刚意识到,其他答案也是我不知道存在的漂亮快捷方式。此代码生成了以下错误:“result”未命名类型auto result=std::bitset(s1)^std::bitset(s2);是否使用-std=c++11标志编译?如果没有,则需要显式拼写返回类型。
#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;
}
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];
}
final_key[i]=(s1[i]!=s2[i]?'1':'0');
string strings_xor(string s, string t) {

string res = "";
for(int i = 0; i < s.size(); i++) {
    if(s[i] == t[i])
        res += '0';
    else
        res += '1';
}

return res;
}
string XOR(string a, string b){

    ll la = a.length();
    ll lb = b.length();
    string X;
    X = (la > lb ) ? a : b;

    ll i=(la>lb)?la-1:lb-1, j = (la<lb)?la-1:lb-1,x=(la>lb? la-1:lb-1) ;
    for(;i>=0,j>=0;i--,j--,x--){

        X[x] =  (la>lb)? ( a[i] ^ b[j] )+'0' : ( b[i] ^ a[j] )+'0'; 
    }


    return X;
}