读取位,在c ++中将位数据写入char数组中的任意位置

时间:2015-10-09 06:05:38

标签: c++ bit-manipulation

我创建函数从char数组的任意位位置读取位数据到long long int,我还创建了从vector bool向char数组写入数据的函数。
但是,我真的不喜欢我的实现,因为我认为它有负担实现,以便读取和写入位。
任何人都可以看到我的实现并启发我更好的实现吗?

以下是我从vector<bool> bitdataForModification写入位数据的实现
unsigned char*& str是原始字符数组 int startBitLocation是从中读取的任意位位置 int sizeToModify是用于修改的位大小

void setBitDataToBitPosition(unsigned char*& str, int startBitLocation, int sizeToModify, std::vector<bool>& bitdataForModification){
    int endBitLocation = startBitLocation + sizeToModify-1;
    int sizeChar = (endBitLocation - startBitLocation)/8;

    //Save leftover data    
    int startCharPosition = startBitLocation/8;
    int startLeftOverBits = startBitLocation%8;

    //endPosition
    int endCharPosition = endBitLocation/8;
    int endLeftOverBits = 7-(endBitLocation%8);

    unsigned char tempChar = str[startCharPosition];
    unsigned char tempLastChar = str[endCharPosition]; // store last char

    int posBitdata = 0;
    for(int i = 0 ; i < startLeftOverBits; i++){
        str[startCharPosition] <<= 1;
        str[startCharPosition] = (str[startCharPosition] | ((tempChar >> (7-i)) & 0x1));
    }

    for(int i = startCharPosition*8 + startLeftOverBits ; i <= endBitLocation ; i++){
        str[i/8] <<= 1;
        if(posBitdata <= endBitLocation){
            str[i/8] = (str[i/8] | ((bitdataForModification[posBitdata]) & 0x1));
            posBitdata++;
        }
    }

    for(int i = 0 ; i < endLeftOverBits ; i++){
        str[endCharPosition] <<= 1;
        str[endCharPosition] = (str[endCharPosition] | ((tempChar >> i) & 0x1));
    }

}

我不喜欢上面的功能,因为它从原始char []复制到temp char []并复制我需要的位。

以下是我实施的阅读功能。 它从char数组中读取并将数据复制到long long int data

void getBitDataFromBitPosition(unsigned char* str, int startBitLocation, int sizeToRead, unsigned long long* data){
    int endBitLocation = startBitLocation + sizeToRead;
    int sizeChar = (endBitLocation - startBitLocation)/8;

    int startCharPosition = startBitLocation/8;
    int endCharPosition = endBitLocation/8 +1;

    vector<bool> bitData;

    int bitCnt = 0;
    for(int i = startCharPosition; i < endCharPosition; i++){
        unsigned char tempChar = str[i];

        for(int j = 7 ; j >= 0 ; j--){
            int curLoc = ((i*8)+(bitCnt%8));
            if(curLoc >= startBitLocation){
                if(curLoc < endBitLocation){

                    bool temp = ((str[i] >> j) & 0x1);
                    bitData.push_back(temp);
                }
            }
            bitCnt++;
        }
    }

    for(int i = bitData.size() -1 ; i >= 0 ; i--){
        *data <<= 1;
        *data = (*data | bitData[bitData.size()-i-1]);      
    }
}

我认为复制到bool矢量并复制回long long int是一种负担。 谁能为我提供更好的解决方案?

提前谢谢!

0 个答案:

没有答案