我有一个例子:
string str = "01100111 011011 011 0110011011 0111101 "
没有数据类型可以保留一点。
首先,我动态分配三个字节;
BYTE* store = new BYTE[3];
其次,把二进制代码< - 我不能编码。
第三,如果它大于指定的大小,则增加3个字节。
我如何编码?
答案 0 :(得分:3)
您有几个选择:
std::vector<bool>
这可能是最像C ++的方式。 std::vector
专门用于bool
,它将每个布尔值存储为一个位。它还为您分配内存,因此如果有更多位,您不必担心调整向量的大小。
有一个缺点是必须通过引用类直接访问这些位,而使用std::vector<bool>
的按位运算符有点尴尬。
C ++还有可用于移动位的运算符<<
,>>
,<<=
和>>=
。 <<
运算符将所有位移到左侧,>>
将它们向右移位。 <<=
和>>=
与<<
和>>
相同,+=
与+
相同。
以下是他们的一个例子:
unsigned char bits = 0b10010010 // uses binary literal syntax
bits <<= 1 // each bit in the variable is shifted left by one, making
// the bits be `00100100`. Note that the overflow is ignored.
bits >>= 2 // bits is now `00001001`
您可以将这些与AND和OR运算符(|
和&
)结合使用来操作位。
此外,虽然这并不能完全解决您的问题,但您还可以使用std::bitset
来表示位。您仍然必须使用按位移位运算符。
答案 1 :(得分:1)
标准库中有一个数据类型std::bitset
;不幸的是,它的大小必须是constexpr
,因此您无法动态定义它(例如,取决于您的内容/字符串的大小)。
实现所需行为的一种方法是使用std::vector<bool>
:
int main() {
string str = "01100111 011011 011 0110011011 0111101 ";
//bitset<70> bits(str); // requires 70 as constexpr
vector<bool> bits;
for (auto c : str) {
if (c=='1')
bits.push_back(true);
else if (c=='0')
bits.push_back(false);
else {
// ignore
}
}
for (auto bit : bits) {
cout << bit;
}
}
请注意,数据类型vector<bool>
可能针对速度/内存消耗进行了优化,但并非必须(参见,例如,cppreference.com - vector):
std :: vector的空间效率(也是如此) 至于它是否完全优化)是实现定义。