如何在MSB位置添加新比特且不改变变量其他位?
解决方法:给unsigned char的最高有效位(MSB)置1且保留其他位
最可靠的位运算方案
直接对byte_variable使用位或操作,完全不依赖编译器的位域实现,代码如下:
byte_8.byte_variable |= 0x80;
0x80的二进制是10000000,按位或操作会将目标字节的最高位设为1,同时保留其他所有位的原有值,完全符合需求。
为什么你的位域方法失效?
C语言标准没有规定位域结构体中成员的位顺序——不同编译器(比如MSVC、GCC)可能将b0对应字节的最低位(LSB)或最高位(MSB),甚至不同架构下的布局也有差异。你设置byte_8.b7 = 1没生效,大概率是因为你的编译器中b7对应的并不是字节的最高位,而是低位,所以操作的不是你想要的MSB。
如果一定要用位域,你需要先查阅所用编译器的文档,确认位域的排列规则,再调整结构体中成员的顺序。但这种方法兼容性差,不推荐跨平台或跨编译器使用。
关于你找到的那段代码
x = 0x80000000 | (x >> 1);是针对32位整数的移位操作(将原有位右移一位,然后在最高位补1,同时丢弃原最低位),和你“仅设置MSB为1、保留其他位”的需求完全不符,所以不适用。
内容的提问来源于stack exchange,提问作者NaturalDemon
相关产品推荐
相关产品推荐

