XOR 两个二进制字符串 c++
XOR two Binary Strings 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];
}
如有任何帮助,我们将不胜感激。
您正在尝试一次异或 2 char
。试试看:
final_key[i] = ((STRING1[i]-'0') ^ (STRING2[i]-'0')) + '0';
说明
请参阅 here 获取 ASCII 值。
'0'
的ASCII值为48,'1'
的ASCII值为49。48 ^ 49
为1,48 ^ 48
,49 ^ 49
为0 . 这些 return 值 0 或 1 到 char
,代表 EOF
字符(如果它是 0)或 SOH
字符(如果它是一个),两者都没有正确输出。
因此,在进行异或运算之前,您可能希望将每个 char
转换为一个位(0 或 1)。因此,您可以从每个 char
中减去 '0'
以获得数字的数值,进行异或运算,然后加回 '0'
以获得正确的输出
字符'0'和'1'的ASCII值为48和49。
要对两个字符 a,b ∈ { '0', '1' } 应用 XOR,您可以使用:
char result = std::abs(a - b) + '0';
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;
}
你的 Xoring characters.That 有效,但你没有将结果转换为字符,而是按原样存储结果。
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');
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;
}
我有两个字符串如下:
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];
}
如有任何帮助,我们将不胜感激。
您正在尝试一次异或 2 char
。试试看:
final_key[i] = ((STRING1[i]-'0') ^ (STRING2[i]-'0')) + '0';
说明
请参阅 here 获取 ASCII 值。
'0'
的ASCII值为48,'1'
的ASCII值为49。48 ^ 49
为1,48 ^ 48
,49 ^ 49
为0 . 这些 return 值 0 或 1 到 char
,代表 EOF
字符(如果它是 0)或 SOH
字符(如果它是一个),两者都没有正确输出。
因此,在进行异或运算之前,您可能希望将每个 char
转换为一个位(0 或 1)。因此,您可以从每个 char
中减去 '0'
以获得数字的数值,进行异或运算,然后加回 '0'
以获得正确的输出
字符'0'和'1'的ASCII值为48和49。 要对两个字符 a,b ∈ { '0', '1' } 应用 XOR,您可以使用:
char result = std::abs(a - b) + '0';
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;
}
你的 Xoring characters.That 有效,但你没有将结果转换为字符,而是按原样存储结果。
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');
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;
}