2016-09-08 110 views
2

我有两个字符串如下:XOR两个二进制字符串C++

STRING1 :  011011110011000 

STRING2 :  011001000001000 

EXPECTED OUTPUT : 000010110010000 

然而,当我尝试异或他们使用下面的代码(按位),输出为空白。 代码:

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

任何帮助,将不胜感激。

回答

6

您正在尝试异或2 char在一个时间。尝试改为:

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

说明

参考here的ASCII值。

'0' ASCII值是48,并且的'1' ASCII值是49. 48^49是1,48^4849^49是0。这些将0或1的值返回到char,这将代表无论是EOF char(如果它是0)或SOH char(如果它是一个),两者都不能正确输出。

因此,在执行XOR操作之前,您需要将每个char转换为一个位(0或1)。因此也可以从各char减去'0'获得数位的numrical值,进行异或操作,然后添加回到'0'得到一个正确的输出

+0

您的解决方案工作。我会尽快接受它。任何解释(如果可能的话)。 –

+5

只是想我会指出一个简化。由于48^49 = 1和48^48 = 49^49 = 0,实际上并不需要从每个输入字符中减去“0”。只需要将“0”添加到结果中。 –

+0

是的,我刚刚意识到,其他答案也是我不知道存在的漂亮快捷方式。 –

2

的字符“0”和“1”是48 ASCII值和49 要在两个角色应用的XOR A,b∈{ '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

你是异或字符。那个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');