Упрощение попытки алгоритма установки битов

Попытка упростить этот работающий, но длинный код для назначения, включающего манипулирование битовым массивом. Что у меня есть для функции set (устанавливает бит в индексе в массиве равным 1):

// set bit with given index to 1
void BitArray::Set   (unsigned int index){
    switch( index%8 )
    {
case 7: 
    barray[index/8] = barray[index/8] | 1;
    break;
case 6: 
    barray[index/8] = barray[index/8] | 2;
    break;
case 5:
    barray[index/8] = barray[index/8] | 4;
    break;
case 4:
    barray[index/8] = barray[index/8] | 8;
    break;
case 3:
    barray[index/8] = barray[index/8] | 16;
    break;
case 2:
    barray[index/8] = barray[index/8] | 32;
    break;
case 1:
    barray[index/8] = barray[index/8] | 64;
    break;
case 0:
    barray[index/8] = barray[index/8] | 128;
    break;
default: cout << "Error. Index less than 0. Cannot set the bit.";

} // end of switch( index )*/

Итак, я иду к элементу в массиве символов, и в этом элементе я затем просматриваю 8 бит, которые хранятся, и меняю этот индекс.

Вот моя попытка упростить оператор switch:

int location = index / 8;
int position = index % 8;

mask = (1 << position);
barray[location] = barray[location] | Mask(index);

который не работает так, как я намереваюсь (устанавливает бит в индексе 5 на «1», если я передаю 2 в качестве индекса для изменения)

Спасибо за любой вклад


person Tyler Kelly    schedule 15.04.2015    source источник
comment
Поскольку вы изменили порядок битов, просто измените порядок позиции (например, 7 - position)   -  person harold    schedule 15.04.2015
comment
это было! спасибо, теперь я помню, что слышал об этом в классе, и я хотел бы вспомнить раньше!   -  person Tyler Kelly    schedule 16.04.2015


Ответы (2)


На самом деле порядок, в котором вы читаете биты, не совпадает с порядком, в котором C (или C++) читает биты. Кажется, вы читаете биты слева направо, а для C «1» - «00000001». Таким образом, вы должны исправить свое утверждение следующим образом (также используя оператор «|=»):

barray[location] |= 1 << (7 - position);

(я игнорирую вашу функцию Mask(index), так как вы ее нам не описали)

person Ekleog    schedule 15.04.2015
comment
Спасибо! да, я забыл убрать эту функцию маски и заменить на ту, которую я объявляю в методе, но по сути то же самое - person Tyler Kelly; 16.04.2015

Похоже, вам нужно определить int position = 7 - (index % 8);.

person Amnon Shochot    schedule 15.04.2015