Как я могу выполнить побитовое ИЛИ для строк?

A:
10001
01010
------
11011

Почему на струнах? Биты могут иметь длину от 40 до 50. Может быть, это может быть проблематично для int? Любые идеи ?

1
mr.bio 30 Мар 2010 в 15:45
Вы имеете в виду, что у вас есть две строки, где каждый символ равен 0 или 1?
 – 
Andreas Brinck
30 Мар 2010 в 15:48
1
У вас уже есть хороший ответ на эту проблему в последний раз: stackoverflow.com/questions/2540742
 – 
Paul R
30 Мар 2010 в 17:14

5 ответов

Лучший ответ

Я бы сказал, что 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;
7
AraK 30 Мар 2010 в 15:51

Вам следует взглянуть на класс C ++ std::bitset, который делает именно то, что вы хотите.

3
Alex Shesterov 27 Апр 2015 в 01:39

Для каждого char:

char result = (a - '0') | (b - '0') + '0';

Где a и b - два символа с символом ascii 0 или 1 в них.

1
Andreas Brinck 30 Мар 2010 в 15:50

Почему бы просто не использовать vector из int значений? Разве bitset по-прежнему не использует байт на бит?

Вы также можете использовать vector из bool значений, но это также зависит от реализации.

В зависимости от того, нужна ли вам эффективность хранения или скорость (или полезность контейнерных методов, которых не хватает в паре этих подходов), вы можете профилировать, чтобы решить, какой подход использовать.

1
Alex Reynolds 30 Мар 2010 в 16:15
2
Нет, это не так. Также в ответах не должно быть вопросов.
 – 
anon
30 Мар 2010 в 15:50
Разве bitset не зависит от реализации?
 – 
Alex Reynolds
30 Мар 2010 в 15:50
После краткого поиска в Google другие, похоже, утверждают, что битовый набор не является частью стандарта STL и не следует соглашениям о контейнерах STL. Хотя я уверен, что это работоспособный вариант.
 – 
Alex Reynolds
30 Мар 2010 в 16:00
Другие могут требовать отказа - это часть стандарта C ++ - см. Раздел 23.3.5, описывающий это.
 – 
anon
30 Мар 2010 в 16:02
Битовый набор @Alex является частью стандарта C ++, но, насколько я могу судить, нет спецификации того, как он хранится, использование байта (или даже int) на бит кажется допустимым.
 – 
Andreas Brinck
30 Мар 2010 в 16:03

Это похоже на ответ Андреаса Бринка, только он возвращает полную выходную строку и может сравнивать строки разной (произвольной) длины.

Пример на 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());
}

Конечно, это действительно только в том случае, если вам действительно нужно, чтобы он был в строке, если нет, вы должны (как предлагается в других ответах) использовать вектор или аналогичный тип данных.

0
David Božjak 30 Мар 2010 в 16:20
У этого есть недостаток, заключающийся в том, что это не C ++.
 – 
anon
30 Мар 2010 в 16:16