C++ 按位操作是否有助于我序列化一些布尔值?
我不习惯二进制文件,我正在努力掌握它的窍门。我设法存储了一些整数和无符号字符,并且毫不费力地读取它们。现在,当我试图保存一些布尔值时,我看到我的每个布尔值在我的文件中正好有一个八位字节,这似乎是合乎逻辑的,因为一个单独的布尔值存储在一个字符大小的数据中(如果我错了,请纠正我!) 但是因为我将有3到4个bool要序列化,所以我认为像这样存储它们是一种浪费:00000001 00000001 00000000,例如,当我可以有00000110时。我想为了得到这个,我应该使用位运算,但我对它们不是很在行。。。谁能告诉我:C++ 按位操作是否有助于我序列化一些布尔值?,c++,bit-manipulation,binaryfiles,C++,Bit Manipulation,Binaryfiles,我不习惯二进制文件,我正在努力掌握它的窍门。我设法存储了一些整数和无符号字符,并且毫不费力地读取它们。现在,当我试图保存一些布尔值时,我看到我的每个布尔值在我的文件中正好有一个八位字节,这似乎是合乎逻辑的,因为一个单独的布尔值存储在一个字符大小的数据中(如果我错了,请纠正我!) 但是因为我将有3到4个bool要序列化,所以我认为像这样存储它们是一种浪费:00000001 00000001 00000000,例如,当我可以有00000110时。我想为了得到这个,我应该使用位运算,但我对它们不是很在
我使用C++,但是我猜想大多数C同构语言都会使用相同的操作。
< P>简单的方法是使用STD::BITSET,它允许你使用索引来访问单个位(BOOLS),然后将得到的值作为整数。它还允许反向操作int main() {
std::bitset<8> s;
s[1] = s[2] = true; // 0b_0000_0110
cout << s.to_ulong() << '\n';
}
intmain(){
std::位集s;
s[1]=s[2]=true;//0b_0000_0110
无法将布尔值存储在一个字节中:
bool flag; // value to store
unsigned char b = 0; // all false
int position; // ranges from 0..7
b = b | (flag << position);
bool标志;//要存储的值
无符号字符b=0;//全部为false
int位置;//范围为0..7
b=b |(标志无需包装在花式模板/预处理器机械中:
- 设置变量中的第3位:
var |=(1尝试按顺序读取此值
有些人会认为第二个链接太死板了,但一旦你掌握了简单的操作,它就会派上用场。首先是基本内容:
- 表示false的位的唯一组合是00000000,其他所有位的组合都表示true,即:00001010000101
- 00000000=0(十进制),00000001=2^0,00000010=2^1,00000100=2^2,…,10000000=2^7
- 操作数(&&,| |)和(&,|)之间有很大区别。第一个操作数给出两个数字之间逻辑运算的结果,例如:
00000000&&00000000=false
01010101&&10101010=真
000011100 | | 00000000=真
00000000 | | 00000000=假
第二对进行逐位运算(数字的每一位之间的逻辑运算):
00000000&00000000=00000000=false
000011111&11110000=00000000=false
01010101&10101001=00000001=true
00001111 | 11110000=11111111=真
000011100 | 00000011=00001111=true
要使用此功能并使用位,您只需了解一些基本技巧:
- 要将位设置为1,您需要使用八位字节进行操作,该八位字节的位置为1,其余位置为ceros
例如:我们希望八位组A的第一位是1,我们制作:A | 0000000 1
- 要将位设置为0,就要进行操作&在该位置有一个0,其余位置有一个
例如:我们希望八位字节A的最后一位为0,我们制作:A&01111111
- 要获得保存位的布尔值,需要进行操作&在该位置有一个1的八位组,其余位置有一个ceros
例如:我们希望看到八位字节A的第三位的值,我们制作:A&00000100,如果A是XXXXX 1x,我们得到00000100=true,如果A是XXXXX 0xX,我们得到00000000=false;您可以始终序列化位字段。类似于:
struct bools
{
bool a:1;
bool b:1;
bool c:1;
bool d:1;
};
有一个1的大小。你在按位运算的哪些方面有困难?这说明了如何做,但也许一些解释也会有帮助,因为OP似乎不确定它背后的逻辑。你应该从0开始计数,而不是从1开始。@ralu:嗯?我想你会发现我有。“第3位”上面提到的是第四位,是吗?我不知道std::bitset,非常感谢你让我发现它。但是,我需要一个无符号字符,甚至认为我可以转换为int,然后转换为uchar,我将执行非强制转换操作。@Raveline:从ulong到无符号字符的强制转换在这里不是问题。到bit Twiddli的链接很棒ng Hacks.TVM
struct bools
{
bool a:1;
bool b:1;
bool c:1;
bool d:1;
};