2016-09-08 159 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');