個々のビットにアクセスしてオンかオフかを確認できる整数の順序付き配列を格納することにより、ブール値の配列を最適化するクラスを作成しようとしています。はい、知っています
std::vector<bool>
はこのようなことを行いますが、練習のために独自の実装を作成しようとしています。
たとえば、unsigned short int は 16 ビットなので、最後の要素がパディングとして機能する 7 つの unsigned short int の配列に 100 個の bool をパックできます。
これをテストすると、何かがすでにうまくいかないことがわかります。おそらく、私の print() 関数に何か問題があります。主に、2 つの unsigned short int の配列に格納される 32 個の bool の BitPack オブジェクトを作成したことがわかります。これがそうであることを確認しました。ただし、次の出力が得られるため、印刷機能が機能していません。これは、本来あるべき 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;
}