Итак, у меня есть массив беззнаковых символов, в настоящее время я пытаюсь написать метод Set (меняет бит в данном индексе на 1). Лучший способ, который я мог придумать, - вместо создания маски для всего массива, я бы просто создал маску размером с байт и только замаскировал место индекса в массиве с заданным битом, который пользователь хочет изменить . Однако каждый раз, когда я пытаюсь это сделать, либо ничего не происходит с результирующим массивом после ИЛИ с маской всех 0 с 1 в битовом индексе, либо я получаю ошибку сегмента. Лучшее, что мне удалось сделать, это изменить правильный бит в первом индексе массива. Как сейчас настроен мой код, я понимаю, почему он меняет только правильный бит в первом байте массива, но каждая попытка изменить это не удалась, я не думаю, что это должно быть сложно, я просто чувствую, что я Я что-то упускаю, но страницы чтения и поиски в гугле ни к чему меня не привели. Вот фрагмент моего кода на данный момент...
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 | mask, я бы интуитивно хотел что-то вроде barray[spot] = barray[spot] | маска; работать. Любая помощь приветствуется.
vector<bool>
илиbitset
? - person Bill   schedule 04.12.2011~
и бинарные операторы<<
,>>
,&
,^
и|
, вместе описываемые как побитовые операторы) должны иметь операнды целочисленного типа. Эти операторы возвращают значения, которые зависят от внутренних представлений целых чисел и имеют аспекты, определяемые реализацией, и неопределенные аспекты для подписанных типов. Некоторые операции над знаковыми типами хорошо определены, но мне гораздо проще просто использовать беззнаковый тип, чем помнить, какие случаи безопасны. - person Keith Thompson   schedule 04.12.2011