我有一个例子:
string str = "01100111 011011 011 0110011011 0111101 "
没有数据类型可以容纳位。
首先,我动态分配三个字节;
BYTE* store = new BYTE[3];
其次,把二进制代码放在<- 我不能编码这个。
第三,如果它大于指定的大小,则增加 3 个字节。
如何编码?
您有几个选择:
1) 使用std::vector<bool>
这可能是最C++的方式。std::vector
专门用于bool
秒,它将每个布尔值存储为一个位。它还为您分配内存,因此您不必担心在有更多位时调整矢量的大小。
有一个缺点,即必须通过引用类才能直接访问位,并且将按位运算符与std::vector<bool>
一起使用有点尴尬。
2) 按位移运算符
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
来表示位。不过,您仍然必须使用按位移位运算符。
标准库中有一个数据类型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 节省空间的方式(以及 因为它是否完全优化)是实现定义的。