我需要从bitset中取出字节,这可能(不)包含多个CHAR_BIT位。我现在需要将多少位中的位放入数组中。例如,
位集声明为std::bitset < 40> id;
有一个单独的变量nBits
id
中有多少位可用。现在我想以CHAR_BIT的倍数提取这些位。我还需要处理nBits % CHAR_BIT != 0
的情况。我可以把它放到uint8
答案 0 :(得分:16)
您可以使用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));
}
答案 1 :(得分:3)
不幸的是,假设你需要的是unsigned long
中的位数(在这种情况下你可以使用to_ulong
),语言中没有好的方法。你必须迭代所有的比特并自己生成字节数组。
答案 2 :(得分:2)
使用标准C ++ 11,可以通过移位和屏蔽从40位bitset
中提取字节。在处理第二个数字不是第一个数字的倍数时,我没有处理不同的值,而不是8和40。
#include <bitset>
#include <iostream>
#include <cstdint>
int main() {
constexpr int numBits = 40;
std::bitset<numBits> foo(0x1234567890);
std::bitset<numBits> mask(0xff);
for (int i = 0; i < numBits / 8; ++i) {
auto byte =
static_cast<uint8_t>(((foo >> (8 * i)) & mask).to_ulong());
std::cout << std::hex << static_cast<int>(byte) << std::endl;
}
}