0

個々のビットにアクセスしてオンかオフかを確認できる整数の順序付き配列を格納することにより、ブール値の配列を最適化するクラスを作成しようとしています。はい、知っています

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;
}
4

2 に答える 2

0

私が見つけて修正したいくつかのエラーがあります:

bool BitPack::getVal(int indx) {
    assert (indx >= 0);                 // Use >=
    usi bA_indx_val = _booArr[indx/USI_BITS];
    bA_indx_val >>= (indx % USI_BITS);  // use indx here instead of bA_indx_val
    return ((bA_indx_val & 1) ? true : false);
}

BitPack::setVal() にもいくつか問題がありました。

void BitPack::setVal(int indx, bool valset) {
    assert (indx >= 0);           // Use >= 
    bool curval = getVal(indx);
    if ((curval == true) && (valset == false)) {
        _booArr[indx/USI_BITS] &= ~(1 << (indx % USI_BITS));  // Use bitwise operators
    } else if ((curval == false) && (valset == true)) {       // corrected this expression
        _booArr[indx/USI_BITS] |= (1 << (indx % USI_BITS));   // Use bitwise operators
    }
}

-= および += を使用してビットを操作することは、&= および |= ビット単位の演算子よりも正しく理解するのがはるかに困難です。

いくつかの基本的なテストで動作するようですが、すべてのビット位置で動作するかどうかは確認していません。

于 2013-11-10T06:25:28.740 に答える