побитовое ИЛИ на строках - PullRequest
1 голос
/ 30 марта 2010

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

A:
10001
01010
------
11011

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

Ответы [ 5 ]

7 голосов
/ 30 марта 2010

Я бы сказал, 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;
3 голосов
/ 30 марта 2010

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

1 голос
/ 30 марта 2010

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

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

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

1 голос
/ 30 марта 2010

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

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

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

0 голосов
/ 30 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...