两串 0 和 1 的异或
XOR of two strings of 0s and 1s
我有两个字符串数组,其中的字符串仅包含 0 和 1。我必须对数组的元素进行异或运算,我必须对两个字符串进行异或运算并将结果存储在第三个数组中。我该如何进行?
例子。字符串 A[],B[],C[]
A[] = {'101','100'} ,B[] = {'110'} 所以输出应该是数组 C[] = {'011','010'}
我是否必须对字符串的各个元素进行异或,从而对两个字符串进行异或,或者有办法直接对它们进行异或吗?
这是我刚刚进行的测试的一部分。我在那里写了代码,我必须完成一个包含两个参数向量的函数。当我尝试执行类似 A[i]^B[i].
的操作时,出现无法识别的运算符错误 ^
没有。您不能像这样 str1 ^ str2
简单地对两个字符串进行异或操作(^ 对于字符串而言,执行此操作不会超载)。
逐步遍历字符串并对字符进行异或运算。您甚至需要 'implement the XOR on chars' 自己(因为 ^ 是按位异或,从您的示例判断这不是您想要的)。
你可以做类似 c[i] = a[i]==b[i] ? '0' : '1'
的事情。或者我想某种小摆弄也会起作用......
从你的问题来看,你的数据类型似乎有误。
如果你写
A[] = {'101','100'}
你让我明白了 A, 不是位数组。因此,无法应用运算符 ^。
基于 GingerPlusPlus 的评论,您可以使用以下方法对两个等长的字符串 0 和 1 进行异或运算:
std::string xor_str( const std::string& a, const std::string& b )
{
std::string c( a.size(), '0' );
std::transform( a.begin(), a.end(), b.begin(), c.begin(),
[] ( char x, char y ) { return x ^ y ^ '0'; } );
return c;
}
并使用以下方式调用:
std::cout << xor_str("0101", "0110") << std::endl;
输出:
0011
我会将它们转换为位集。
假设你想用第二个
计算第一个集合的异或
#include <bitset>
#include <string>
#include <vector>
#include <iostream>
int main(void)
{
const size_t numbits = 3;
std::vector<std::bitset<numbits>> b1;
std::vector<std::bitset<numbits>> b2;
std::bitset<numbits> b11 (std::string("101"));
std::bitset<numbits> b12 (std::string("100"));
b1.push_back(b11);
b1.push_back(b12);
std::bitset<numbits> b21 (std::string("110"));
b2.push_back(b21);
std::vector<std::bitset<numbits>> res;
res.reserve(b1.size()*b2.size());
std::bitset<numbits> xorres;
for(size_t i = 0; i < b1.size(); i++)
{
for(size_t j = 0; j < b2.size(); j++)
{
xorres = (b1[i]^= b2[j]);
res.push_back(xorres);
}
}
for(size_t k = 0; k < res.size(); k++)
{
std::cout << "RES N" << k <<" " << res[k] << std::endl;
}
}
生成结果
RES N0 011
RES N1 010
我有两个字符串数组,其中的字符串仅包含 0 和 1。我必须对数组的元素进行异或运算,我必须对两个字符串进行异或运算并将结果存储在第三个数组中。我该如何进行?
例子。字符串 A[],B[],C[]
A[] = {'101','100'} ,B[] = {'110'} 所以输出应该是数组 C[] = {'011','010'}
我是否必须对字符串的各个元素进行异或,从而对两个字符串进行异或,或者有办法直接对它们进行异或吗?
这是我刚刚进行的测试的一部分。我在那里写了代码,我必须完成一个包含两个参数向量的函数。当我尝试执行类似 A[i]^B[i].
的操作时,出现无法识别的运算符错误 ^没有。您不能像这样 str1 ^ str2
简单地对两个字符串进行异或操作(^ 对于字符串而言,执行此操作不会超载)。
逐步遍历字符串并对字符进行异或运算。您甚至需要 'implement the XOR on chars' 自己(因为 ^ 是按位异或,从您的示例判断这不是您想要的)。
你可以做类似 c[i] = a[i]==b[i] ? '0' : '1'
的事情。或者我想某种小摆弄也会起作用......
从你的问题来看,你的数据类型似乎有误。 如果你写
A[] = {'101','100'}
你让我明白了 A, 不是位数组。因此,无法应用运算符 ^。
基于 GingerPlusPlus 的评论,您可以使用以下方法对两个等长的字符串 0 和 1 进行异或运算:
std::string xor_str( const std::string& a, const std::string& b )
{
std::string c( a.size(), '0' );
std::transform( a.begin(), a.end(), b.begin(), c.begin(),
[] ( char x, char y ) { return x ^ y ^ '0'; } );
return c;
}
并使用以下方式调用:
std::cout << xor_str("0101", "0110") << std::endl;
输出:
0011
我会将它们转换为位集。 假设你想用第二个
计算第一个集合的异或 #include <bitset>
#include <string>
#include <vector>
#include <iostream>
int main(void)
{
const size_t numbits = 3;
std::vector<std::bitset<numbits>> b1;
std::vector<std::bitset<numbits>> b2;
std::bitset<numbits> b11 (std::string("101"));
std::bitset<numbits> b12 (std::string("100"));
b1.push_back(b11);
b1.push_back(b12);
std::bitset<numbits> b21 (std::string("110"));
b2.push_back(b21);
std::vector<std::bitset<numbits>> res;
res.reserve(b1.size()*b2.size());
std::bitset<numbits> xorres;
for(size_t i = 0; i < b1.size(); i++)
{
for(size_t j = 0; j < b2.size(); j++)
{
xorres = (b1[i]^= b2[j]);
res.push_back(xorres);
}
}
for(size_t k = 0; k < res.size(); k++)
{
std::cout << "RES N" << k <<" " << res[k] << std::endl;
}
}
生成结果
RES N0 011
RES N1 010