2

我有两个字符串如下:

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

任何帮助,将不胜感激。

4

6 回答 6

9

您正在尝试char一次异或 2。请尝试:

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 到 a char,这将代表一个EOFchar(如果它是 0)或一个SOHchar (如果是一个),则两者都不能正确输出。

因此,您可能希望char在执行 XOR 操作之前将每个转换为位(0 或 1)。'0'因此,您可以从每个中减去char以获得数字的数值,进行 XOR 运算,然后加回'0'以获得正确的输出

于 2016-09-08T15:01:56.210 回答
4

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;
}
于 2016-09-08T15:13:03.193 回答
3

字符 '0' 和 '1' 的 ASCII 值是 48 和 49。要对两个字符 a,b ∈ { '0', '1' } 应用 XOR,您可以使用:

char result = std::abs(a - b) + '0';
于 2016-09-08T15:07:53.223 回答
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;
}

希望这可以帮助。

于 2019-07-20T18:33:17.723 回答
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');
于 2016-09-08T15:16:44.253 回答
0

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

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;
} 
于 2019-12-13T16:55:16.510 回答