C ++ 11 — Как выполнять логические операции в переполнении стека

Я хочу добавить два булевых векторов

vector<bool> v1= {0,0,1}
vector<bool> v2= {1,0,1}
vector<bool> resultedVector = v1+v2

Ответ должен быть:

resultedVector = {1,1,0};

Кто-нибудь знает, как это сделать в c++/c++11 ?
Я хочу каждый раз увеличивать заданный логический вектор на 1. И просто хочу использовать бинарные операции. Или может создать таблицу булевых истин с заданным числом переменных.

-3

Решение

Чтобы выполнить двоичное добавление в C ++, вы можете использовать функцию, описанную здесь:
Добавление двоичных чисел в C ++

Я реализовал функцию по этой ссылке, чтобы она соответствовала вашим требованиям:

std::vector<bool> add(const std::vector<bool>& a, const std::vector<bool>& b)
{
bool c;
std::vector<bool> result;
for(int i = 0; i < a.size() ; i++){
result.push_back(false);
result[i] = ((a[i] ^ b[i]) ^ c); // c is carry
c = ((a[i] & b[i]) | (a[i] & c)) | (b[i] & c);
}
return result;
}

Эта функция принимает два вектора значений типа bools (и предполагает, что они имеют одинаковый размер) и возвращает их вектор результатов. Очевидно, что эта функция не обрабатывает переполнение или числа разных размеров. Вы можете изменить его самостоятельно, если вам нужны эти возможности. Кроме того, вы, похоже, говорите о перегруженном операторе для вектора bool, и вы можете сделать это, проверив перегрузку операторов, но эта логика позволит вам добавить два логических числа, хранящихся в векторах.

0

Другие решения

Я не уверен, что понимаю ваш вопрос. Так как это выглядит как домашнее задание, а вопрос, по-видимому, заключается в перегрузке операторов, вот идея, а не полный ответ:

#include <vector>

std::vector< bool > operator+( const std::vector<bool>& a, const std::vector<bool>& b )
{
std::vector< bool > r;
// your code goes here
return r;
}

int main()
{
std::vector< bool > a, b, c;
c = a + b;
return 0;
}

РЕДАКТИРОВАТЬ — один день спустя

Вот решение вашей проблемы приращения (демонстрация):

#include <iostream>
#include <vector>

// preinc - no grow on overflow
std::vector< bool >& operator++( std::vector<bool>& v )
{
for ( auto e : v )
if ( e = !e )
break;
return v;
}

// postinc - no grow on overflow
std::vector< bool > operator++( std::vector<bool>& v, int )
{
auto t { v };
operator++( v );
return t;
}

// insert
std::ostream& operator<<( std::ostream& os, const std::vector< bool > v )
{
for ( std::vector< bool >::const_reverse_iterator ci = v.rbegin(); ci != v.rend(); ++ci )
os << *ci ? '1' : '0';
return os;
}

int main()
{
std::vector< bool > b {0,0,0,0};
for ( int i = 0; i < 16; ++i )
{
std::cout << b << std::endl;
++b;
}

return 0;
}
0

Вот как вы можете использовать функтор с состоянием:

struct BitAdder {
bool carry_ = 0x0;  // Range is [0, 1].

// Only accepts single bit values for a and b.
bool operator()(bool a, bool b) {
assert(a == (a & 0x1) && b == (b & 0x1));
char sum = a + b + carry_;
carry_ = (sum & 0x2) >> 1;  // Keep in range.
return sum & 0x1;
}
};

// Code is more straightforward when bits are stored in reverse.
std::vector<bool> v = {0, 1, 1, 1, 0};  // To be interpreted as:  1110 (14).
std::vector<bool> w = {1, 0, 1, 1, 0};  // To be interpreted as:  1101 (13).
std::vector<bool> result = {0, 0, 0, 0, 0};  //     Will become: 11011 (27).

assert(v.size() <= w.size());  // v and w can be iterated over together.
assert(v.size() <= result.size());  // There is enough space to store the bits.
assert(v[v.size() - 1] + w[v.size() - 1] < 2);  // No overflow can happen.
std::transform(v.cbegin(), v.cend(), w.cbegin(), result.begin(), BitAdder());

std::cout << "want: 11011, got: ";
std::copy(result.crbegin(), result.crend(), std::ostream_iterator<bool>(std::cout));
std::cout << '\n';

Live Demo

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector