C ++ использует массив символов для хранения битов / не может получить побитовые операции - PullRequest
2 голосов
/ 04 декабря 2011

Итак, у меня есть массив беззнаковых символов, в настоящее время я пытаюсь написать метод Set (изменяет бит в данном индексе на 1).Лучший способ сделать это - создать маску для всего массива, я бы просто создал маску размером в байт и замаскировал только место индекса в массиве с заданным битом, который пользователь хочет изменить.,Тем не менее, каждый раз, когда я пытаюсь это сделать, либо ничего не происходит с результирующим массивом после ИЛИ с маской из всех 0 с 1 в битовом индексе, либо я получаю ошибку сегмента.Лучшее, что я смог сделать, это изменить правильный бит в первом индексе массива.Как мой код в настоящее время настроен прямо сейчас, я понимаю, почему он только изменяет правильный бит в первом байте массива, но каждая попытка изменить это терпела неудачу, я не думаю, что это должно быть сложно, я просто чувствую, что я 'Я что-то упустил, но страницы чтения и поиски в Google не привели меня никуда.Вот фрагмент моего кода на данный момент ...

void BitArray::Set (unsigned int index)
 70 {
 71     int spot;       // index in barray where 
 72                     // bit to be set is located
 73     char mask;       
 74     if (index < 8)
 75     {   
 76         spot = 0;
 77         mask = 1 >> index - 1;
 78     }   
 79     else
 80     {
 81         int spot = index / 8;
 82         mask = 1 << (index - (8*spot) - 1);
 83     }   
 84     
 85     *barray = *barray | mask;
 86 }   

Вместо * barray = * barray |маска, я бы интуитивно хотел что-то вроде барри [пятно] = баррей [пятно] |маска;работать.Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2011

Я не уверен, почему вы идете вразрез с вашим интуитивным представлением о array[spot] = barray[spot] | mask; И вы, кажется, делаете вычисления спот и маски более сложными, чем необходимо.

Почему вы сделали index < 8 особенным случаем?

if(index < 8) 
    spot = 0;
...
else
    spot = index / 8;

В обоих случаях index / 8 дает правильный индекс байта, верно?

Во-вторых, как любая из следующих строк дает вам правильную позицию бита? Почему ты вообще смещаешь? Какое отношение spot, индекс байта, к которому у вас есть доступ, связано с позицией бита внутри байта?

mask = 1 >> index - 1;

mask = 1 << (index - (8*spot) - 1);

Вот мое непроверенное решение:

void BitArray::Set(unsigned int index)
{
    int spot = index / 8;
    char bit = 1 << (index % 8);
    barray[spot] = barray[spot] | bit;
}
0 голосов
/ 04 декабря 2011

Может быть проблема с barray?
В любом случае, этот код должен работать:

void BitArray::Set (unsigned int index)
{
    //assert(index / 8 < arraySize);

    static const unsigned char masks[8] = {1, 2, 4, 8, 16, 32, 64, 128};

    barray[index / 8] |= masks[index % 8];
}

Обратите внимание, что любой современный компилятор выдаст код, равный

barray[index >> 3] |= masks[index & 7];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...