字符串上的按位OR

时间:2010-03-30 11:45:36

标签: c++ string bit-manipulation

如何对字符串执行按位OR?

A:
10001
01010
------
11011

为什么要上弦? 比特可以有40-50的长度。也许这可能是int的问题? 任何想法?

5 个答案:

答案 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';

其中ab是两个字符,其中包含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());
}

当然这只有在你真的需要它在一个字符串中才有效,如果不是你应该(如其他答案所示)使用矢量或类似的数据类型。