std::bitset是否具有位序可移植性?

8
C++对位序有什么规定吗?我正在研究协议数据包布局,我怀疑是否有一种可移植的方式来指定某个数字写入第5、6、7位,其中第5位是“最高有效位”。
我的问题:
  • 0x01总是表示为设置了第7位的字节吗?
  • bitset<8>().set(7).to_ulong()是否总是等于1?

5
0x01 的第 0 位被设置了,而不是第 7 位。 - trojanfoe
@trojanfoe:这正是我所质疑的。 - xtofl
在 C 和 C++ 中,位 0 总是最低有效位。 - trojanfoe
是的,在C++11中请参考脚注49。 - MSalters
@xtofl,我当然不介意,我只是负责删除新标签的居民。 - Charles
显示剩余2条评论
3个回答

11

来自20.5/3 (ISO/IEC 14882:2011)

在类bitset对象和某些整数类型之间进行转换时,位位置pos对应于位值1 << pos。

也就是说,bitset<8>().set(7).to_ulong()保证等于(1 << 7) == 128


2

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

2
如果问题是在将二进制对象发送到网络时是否可以忽略平台的字节顺序,那么答案是否定的。如果问题是相同的代码在两个不同的平台上编译是否会产生相同的结果,那么答案是肯定的。

我的关注点是前者 - 将 bitset.set(7).to_ulong() 发送到另一个平台,并且 bitset(received).isset(7)true - xtofl
@xtofl,你是如何发送 std::bitset 的? - deft_code
1
@xtofl 这将取决于您如何序列化数据。如果您转换为ASCII,那么就是真的;如果您转换为“long”,然后通过二进制协议发送它,您将不得不使用常见的htonl/ntohl转换;如果您只修改单个字节,则可以只发送该字节,那里没有字节序影响... - David Rodríguez - dribeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接