C++ 对位排序有什么说法吗?我特别致力于协议数据包布局,我怀疑是否有一种可移植的方式来指定将某个数字写入位 5、6、7,其中位 5 是“最重要的”。
我的问题:
- 0x01 是否总是表示为设置了第 7 位的字节?
- 总是
bitset<8>().set(7).to_ulong()
等于 1?
C++ 对位排序有什么说法吗?我特别致力于协议数据包布局,我怀疑是否有一种可移植的方式来指定将某个数字写入位 5、6、7,其中位 5 是“最重要的”。
我的问题:
bitset<8>().set(7).to_ulong()
等于 1?从 20.5/3 (ISO/IEC 14882:2011)
在类 bitset 的对象和某个整数类型的值之间进行转换时,位位置 pos 对应于位值 1 << pos。
即,bitset<8>().set(7).to_ulong()
保证为(1 << 7) == 128
。
bitset 不做序列化,所以你不需要(需要)知道。使用序列化/反序列化。
bitset<8>().set(7).to_ulong() 总是等于 1
不,不在我的机器上(见下文)。
但是,我当然希望 iostream 操作符具有可移植性:
#include <bitset>
#include <sstream>
#include <iostream>
int main()
{
std::bitset<8> bits;
std::cout << bits.set(7).to_ulong() << std::endl;
std::stringstream ss;
ss << bits;
std::cout << ss.rdbuf() << std::endl;
std::bitset<8> cloned;
ss >> cloned;
std::cout << cloned.set(7).to_ulong() << std::endl;
std::cout << cloned << std::endl;
}
印刷
128
10000000
128
10000000
如果问题是您是否可以在通过网络发送二进制对象时愉快地忽略平台的字节顺序,答案是您不能。如果问题是在两个不同平台上编译的相同代码是否会产生相同的结果,那么答案是肯定的。