我需要從位集中提取字節,而不是包含多個CHAR_BIT位。我現在需要將bitset中的多少位放入數組中。例如,如何將bitset轉換爲bytes/uint8數組?
的位置被聲明爲std::bitset < 40> id;
有一個單獨的可變nBits
多少比特在id
是可用的。現在我想要以CHAR_BIT的倍數提取這些位。我還需要處理nBits % CHAR_BIT != 0
的情況。我可以把它放入一個uint8數組中
我需要從位集中提取字節,而不是包含多個CHAR_BIT位。我現在需要將bitset中的多少位放入數組中。例如,如何將bitset轉換爲bytes/uint8數組?
的位置被聲明爲std::bitset < 40> id;
有一個單獨的可變nBits
多少比特在id
是可用的。現在我想要以CHAR_BIT的倍數提取這些位。我還需要處理nBits % CHAR_BIT != 0
的情況。我可以把它放入一個uint8數組中
不幸的是,如果你需要比unsigned long
中的位數(在這種情況下你可以使用to_ulong
),語言中沒有好的方法。你必須遍歷所有的位並自己生成字節數組。
您可以使用boost::dynamic_bitset,可以使用boost::to_block_range將其轉換爲「塊」的範圍。
#include <cstdlib>
#include <cstdint>
#include <iterator>
#include <vector>
#include <boost/dynamic_bitset.hpp>
int main()
{
typedef uint8_t Block; // Make the block size one byte
typedef boost::dynamic_bitset<Block> Bitset;
Bitset bitset(40); // 40 bits
// Assign random bits
for (int i=0; i<40; ++i)
{
bitset[i] = std::rand() % 2;
}
// Copy bytes to buffer
std::vector<Block> bytes;
boost::to_block_range(bitset, std::back_inserter(bytes));
}
苛刻...如果你的sizeof(unsigned long)比特小於sizeof,這可以直接使用'bitset :: to_ulong'。事實上,我不認爲有一個簡單的解決方案。 'std :: bitset'沒有像'std :: vector'那樣的'data()'(儘管gcc版本有一個沒有記錄的實驗'_M_getdata'函數就是這個......)'。由於沒有其他的東西,你只能單獨訪問各個位。或者,序列化爲一個字符串或通過一個流,但這些都不是特別有效。 – Damon