如何对字符串执行按位OR?
A:
10001
01010
------
11011
为什么要上弦? 比特可以有40-50的长度。也许这可能是int的问题? 任何想法?
答案 0 :(得分:7)
我认为std::bitset
对您的情况来说已经足够了,但为了获得更大的灵活性,您可以使用boost::dynamic_bitset
。以下是std::bitset
上的示例:
const size_t N = 64;
string a_str = "10001", b_str = "01010";
bitset<N> a(a_str), b(b_str);
bitset<N> c = a | b;
cout << c;
答案 1 :(得分:3)
你应该看看C ++ std::bitset
类,它完全符合你的要求。
答案 2 :(得分:1)
为什么不使用vector
int
个值? bitset
是否仍然每位使用一个字节?
您还可以使用vector
bool
个值,但这也是特定于实现的。
根据您是否需要存储效率或速度(或其他几种方法所缺乏的容器方法的效用),您可能会决定使用哪种方法。
答案 3 :(得分:1)
对于每个char
:
char result = (a - '0') | (b - '0') + '0';
其中a
和b
是两个字符,其中包含ascii字符0或1。
答案 4 :(得分:0)
这与Andreas Brinck的答案相似,只是它返回一个完整的输出字符串,可以比较不同(任意)长度的字符串。
C#中的示例(目前不在c ++编译器附近),但将其转换为您选择的语言应该很简单。
public static string BitwiseOr(string input1, string input2)
{
char[] inarr1 = (char[])input1.ToCharArray().Reverse().ToArray();
char[] inarr2 = (char[])input2.ToCharArray().Reverse().ToArray();
char[] outarr = new char[input1.Length > input2.Length ? input1.Length : input2.Length];
for (int i = 0; i < outarr.Length ; i++)
{
char c1 = i < input1.Length ? inarr1[i] : '0';
char c2 = i < input2.Length ? inarr2[i] : '0';
outarr[i] = (char)((c1 - '0') | (c2 - '0') + '0');
}
return new string((char[])outarr.Reverse().ToArray());
}
当然这只有在你真的需要它在一个字符串中才有效,如果不是你应该(如其他答案所示)使用矢量或类似的数据类型。