Как работает побитовое или в с++?
Пытаюсь решить задачу "Удалить или максимизировать" (сайт - Timus Online Judges, номер - 2110) Вообще не понимаю, как в плюсах работает побитовое или.
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int count(string el) {
int a = 0;
for (int i = 0; i < el.length(); i++) {
if (el[i] == '0') { a++; }
}
return a;
}
int main()
{
int a = 0, n, k, max = -999999999, it, sum = 0;
bool flag = 1;
cin >> n >> k;
if (n == k) { cout << 0; return 0; }
vector <string> dvoichnoe(n);
vector <int> ch(n), copy(n);
for (int i = 0; i < n; i++){
cin >> ch[i];
copy[i] = ch[i];
if (ch[i] == 0) { dvoichnoe[i] = "0"; flag = 0; }
if (flag) {
while (ch[i] / 2 != 0) {
dvoichnoe[i].append(to_string(ch[i] % 2));
ch[i] = ch[i] / 2;
}
dvoichnoe[i].append("1");
reverse(dvoichnoe[i].begin(), dvoichnoe[i].end());
}
flag = 1;
}
copy = ch;
while (k != 0){
for (int i = 0; i < dvoichnoe.size(); i++) {
a = count(dvoichnoe[i]);
if (a > max) { max = a; it = i; }
}
dvoichnoe.erase(dvoichnoe.begin() + it, dvoichnoe.begin() + it + 1);
copy.erase(copy.begin() + it, copy.begin() + it + 1);
k--;
}
for (int i = 0; i < dvoichnoe.size() - 1; i++) {
sum += stoi(dvoichnoe[i]) | stoi(dvoichnoe[i + 1]);
}
cout << sum;
}
при входных данных 4 1 98765432 98765432 98765432 1 выдает std::out_of_range в строке, где ищу сумму, при том, что i не выходит за границы массива, и вообще, я не понимаю, как считается побитовое или
Ответы (2 шт):
числа в компьютере представлены в виде последовательности нулей и единиц, побитовые операции выполняются над каждым битом исходного числа, чисел
например 2 | 5 = 7, потому что 2 - 010 в двоичной записи, 5 - 101, 010 | 101 = 111, что в в переводе в десятичную систему 7
#include <iostream>
int main()
{
std::cout << (2 | 5) << '\n'; // 7
return 0;
}
Насколько я понял, вы пытаетесь в вектор dvoichnoe записать строковые представления двоичного представления чисел (хоть и в кашу превратили эту попытку). Число 98765432 будет иметь значение 0101111000110000101001111000 в двоичном виде, и у вас в векторе будет эта строка. А stoi("0101111000110000101001111000")? пытается вернуть вам int(101111000110000101001111000), а такое значение int не вмещает. Потому и получаете ошибку, связанную с выходом диапазона ячейки памяти.
И, как совет, Вам лучше пересмотреть весь подход решения задачи.