C++ 更清晰地将变量分配到无符号字符数组的当前索引

C++ 更清晰地将变量分配到无符号字符数组的当前索引,c++,C++,前四个变量是值为0或1的unsigned char messageType是unsigned char,例如:48 我想知道是否有某种方法可以使代码更清晰 我尽量不使用任何图书馆 std::vector<unsigned char> packet(2); packet.at(0) |= (retain) << 0; packet.at(0) |= (qosLevel >> 0) << 1; packet.at(0) |= (qosLevel &g

前四个变量是值为
0
1
unsigned char

messageType
unsigned char
,例如:
48

我想知道是否有某种方法可以使代码更清晰

我尽量不使用任何图书馆

std::vector<unsigned char> packet(2);

packet.at(0) |= (retain) << 0;
packet.at(0) |= (qosLevel >> 0) << 1;
packet.at(0) |= (qosLevel >> 1) << 2;
packet.at(0) |= (dupFlag) << 3;
packet.at(0) |= ((messageType >> 4) & 1) << 4;
packet.at(0) |= ((messageType >> 5) & 1) << 5;
packet.at(0) |= ((messageType >> 6) & 1) << 6;
packet.at(0) |= ((messageType >> 7) & 1) << 7;
std::向量包(2);

packet.at(0)|=(retain)>0)>1)4)&1)>5)&1)>6)&1)>7)&1)如果确定变量不包含任何额外位,则可以写入:

    unsigned char packet[2] = { 0 };
    packet[0] |= retain;
    packet[0] |= qosLevel << 1;
    packet[0] |= dupFlag << 3;
    packet[0] |= messageType;
无符号字符包[2]={0};
数据包[0]|=保留;

packet[0]|=qosLevel如果确定变量不包含任何额外位,则可以写入:

    unsigned char packet[2] = { 0 };
    packet[0] |= retain;
    packet[0] |= qosLevel << 1;
    packet[0] |= dupFlag << 3;
    packet[0] |= messageType;
无符号字符包[2]={0};
数据包[0]|=保留;

数据包[0]|=qosLevel可能是位字段?虽然IIRC在复制整个对象时会改变位字段的顺序,但这是实现定义的,因此,如果您计划通过网络序列化数据,IIRC将不起作用。
std::bitset
matybeI很抱歉。我忘了说我不想使用任何图书馆。@JohnDoe甚至不想使用STL?我想您已经在使用它与
std::vector
。因为对于纯
无符号字符
,此代码将无法工作。我的意思是我只在必要的时候才使用图书馆。对不起,我误解了。也许是比特域?虽然IIRC在复制整个对象时会改变位字段的顺序,但这是实现定义的,因此,如果您计划通过网络序列化数据,IIRC将不起作用。
std::bitset
matybeI很抱歉。我忘了说我不想使用任何图书馆。@JohnDoe甚至不想使用STL?我想您已经在使用它与
std::vector
。因为对于纯
无符号字符
,此代码将无法工作。我的意思是我只在必要的时候才使用图书馆。我很抱歉误会了。