简化位集算法尝试

时间:2015-04-15 20:51:20

标签: c++ arrays bit-manipulation bit bitmask

尝试为涉及位数组操作的赋值简化此工作但冗长的代码。到目前为止我对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 )*/

所以我要去一个char数组中的一个元素,然后在那个元素中我会查看保存和更改该索引的8位。

这是我尝试简化switch语句:

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

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

不按我想要的方式工作(将索引5的位设置为&#39; 1&#39;如果我传入2作为要更改的索引)

感谢任何输入

2 个答案:

答案 0 :(得分:4)

实际上,读取位的顺序不是C(或C ++)读取位的顺序。您似乎是从左到右读取位,而对于C“1”是“00000001”。 所以你应该这样修复你的语句(也使用“| =”运算符):

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

(我忽略了你的功能Mask(index),因为你没有向我们描述)

答案 1 :(得分:2)

看起来您需要的是定义int position = 7 - (index % 8);