Bitset. Изменение битов элементов

88
20 марта 2022, 00:00

Есть некоторые массивы

bitset<8> BIN_BROADCAST[4] = {}; // пустой
bitset<8> BIN_REZ[4] = {}; // тут {10000010 00000100 01100100 00000000}

Нужно заменить последние 10 нулей на 1. Пробовал несколько вариантов реализации, но ничего разумного не вышло, вот моё последнее решение(мне оно кажется наиболее логичным), но оно вызывает в билдере external exception eefface

bitset<8> BIN_HOST[1] = {}; // кол-во нулей для замены
int KOL_NULL = 0;

for(int i = 4; i > 0; i--){
    for(int j = 8; j > 0; j--){
       BIN_BROADCAST[i][j] = BIN_REZ[i][j].flip();
       KOL_NULL += 1;
       if(KOL_NULL == BIN_HOST[0].to_ulong()){
            break;
       }
    }
    break;
}
for (int i = 0; i < 4; i++) {
    Memo1 ->Lines ->Add(BIN_BROADCAST[i].to_ulong());
}
Answer 1

Лично мое мнение в данной задаче не хранить все в массиве, а в bitset<32>.

Чтобы поменять бито с позиции a по позицию б самое элементарное пройтись циклом и дернуть там флип.

Вот минимальный пример кода.

#include <iostream> 
#include <bitset>

void FormOut(std::bitset<32> bs) {
    for (std::size_t i{ 0 }; i < 4; ++i) {
        std::bitset<8> tmp;
        for (std::size_t j{ 0 }; j < 8; ++j) {
            tmp[j] = bs[4 * i + j];
        }
        std::cout << tmp.to_ulong() << " ";
    }
    std::cout << std::endl;
}

int main() {
    const std::size_t bit_size{32};
    std::bitset<bit_size> bs;
    FormOut(bs);
    for (std::size_t i{ 0 }; i < bit_size; ++i) {
        bs[i] = 1;
    }
    FormOut(bs);
    std::size_t from{3}, to {12};
    if (from > bit_size || to > bit_size) {
        return -1;
    }
    if (to < from) {
        std::swap(to, from);
    }
    for (std::size_t i{from}; i < to; ++i) {
        bs[i].flip();
    }
    FormOut(bs);
    return 0;
}
Answer 2

как минимум, вместо

for(int i = 4; i > 0; i--){
    for(int j = 8; j > 0; j--){

надо

for(int i = 3; i >= 0; i--){
    for(int j = 7; j >= 0; j--){

а по-хорошему, надо переделать вообще всё. Массивы из битмапов какие-то на ровном месте...

READ ALSO
Что делает следующая строчка?

Что делает следующая строчка?

Есть динамический массив под названием buffer, который хранит в себе строку в стиле С(Например какое-нибудь предложение: Hello world) Что делает данная...

54
Как в MySql осуществить обход древа

Как в MySql осуществить обход древа

Имеется вот такая таблица

102
Настройка поддоменов на Spring Boot

Настройка поддоменов на Spring Boot

У меня есть выделенный сервер и домен examplecom

215
Как получить количество строк в sqlite в java android studio? [дубликат]

Как получить количество строк в sqlite в java android studio? [дубликат]

Есть база данных sqlite, как получить количество содержащихся в ней строк?

82