我正在尝试创建一个通过存储整数的有序数组来优化布尔数组的类,这些整数的位可以访问各个位以查看它们是打开还是关闭。对我知道那个
std::vector<bool>
做这样的事情,但我正在尝试自己实现,以供练习。
例如,一个无符号短整数是 16 位,所以我可以将 100 个布尔值打包成一个由 7 个无符号短整数组成的数组,其中最后一个元素充当填充。
当我对此进行测试时,我发现某些地方已经出了问题,可能与我的 print() 函数有关。在 main 中,您可以看到我创建了一个包含 32 个布尔值的 BitPack 对象,它将存储在一个由 2 个无符号短整数组成的数组中,并且我已经验证确实如此。但是,我的打印功能不起作用,因为它给了我以下输出,而不是应该的 32 个零。
0000000000000000
我已经多次查看我的打印功能,但无法找出问题所在。很抱歉,当我在这里复制我的代码时丢失了任何缩进。非常感谢任何帮助。
#include <iostream>
#include <limits.h>
#include <assert.h>
typedef unsigned short int usi;
class BitPack {
public:
BitPack(int);
~BitPack();
bool getVal(int);
int getSize();
void setVal(int, bool);
void print();
private:
const static int USI_BITS = sizeof(usi)*CHAR_BIT;
usi* _booArr;
int _booArrLen;
int _numBoos;
};
BitPack::BitPack(int sz) {
assert (sz > 0);
_numBoos = sz;
_booArrLen = _numBoos/USI_BITS+(_numBoos % USI_BITS ? 1 : 0);
_booArr = new usi[_booArrLen];
for (int i = 0; i < _booArrLen; ++i)
_booArr[i] = 0;
}
BitPack::~BitPack() {
delete[] _booArr;
}
bool BitPack::getVal(int indx) {
assert (indx > 0);
usi bA_indx_val = _booArr[indx/USI_BITS];
bA_indx_val >>= (bA_indx_val % USI_BITS);
return (bA_indx_val % 2 ? true : false);
}
int BitPack::getSize() {
return (_numBoos);
}
void BitPack::setVal(int indx, bool valset) {
assert (indx > 0);
bool curval = getVal(indx);
if ((curval == true) && (valset == false)) {
_booArr[indx/USI_BITS] += (1 << (indx % USI_BITS));
} else if ((curval == true) && (valset == false)) {
_booArr[indx/USI_BITS] -= (1 << (indx % USI_BITS));
}
}
void BitPack::print() {
int i = 0;
usi thisval;
while (i < _booArrLen - 1) {
thisval = _booArr[i];
for (int j = 0; j < USI_BITS; ++j) {
std::cout << (thisval % 2 ? '1' : '0');
thisval >>= 1;
}
i++;
}
thisval = _booArr[i];
for (int j = 0; j < _numBoos % USI_BITS; ++j) {
std::cout << (thisval % 2 ? '1' : '0');
thisval >>= 1;
}
}
int main (int argc, char* const argv[]) {
BitPack bp(32);
bp.print();
return 0;
}