如何使用位域(结构体)重写代码并访问signed short的高低位
嘿,我明白你需要用位域来替代位运算访问signed short的各个位,这其实比你想的更直接——核心思路是用**联合体(union)**让signed short和位域结构体共享内存,这样就能通过结构体成员直接访问每一位。下面是重写后的完整代码,再给你拆解关键细节:
完整重写代码
#include <iostream> using namespace std; // 定义对应signed short的位域结构体 struct ShortBits { // 注意:位域的顺序取决于编译器端序,这里假设从最低位(bit0)开始定义 unsigned int bit0 : 1; unsigned int bit1 : 1; unsigned int bit2 : 1; unsigned int bit3 : 1; unsigned int bit4 : 1; unsigned int bit5 : 1; unsigned int bit6 : 1; unsigned int bit7 : 1; unsigned int bit8 : 1; unsigned int bit9 : 1; unsigned int bit10 : 1; unsigned int bit11 : 1; unsigned int bit12 : 1; unsigned int bit13 : 1; unsigned int bit14 : 1; // 最高位是符号位,用signed int保留符号属性 signed int bit15 : 1; }; // 用联合体让signed short和位域共享同一块内存 union ShortUnion { signed short num; ShortBits bits; }; void print(signed short num) { ShortUnion su; su.num = num; // 把输入的signed short赋值给联合体成员 // 直接通过位域结构体访问每一位 for (int i = 0; i < 15; ++i) { // 位域成员不能直接数组索引,用switch简化循环输出 switch(i) { case 0: cout << i << " bit is " << su.bits.bit0 << endl; break; case 1: cout << i << " bit is " << su.bits.bit1 << endl; break; case 2: cout << i << " bit is " << su.bits.bit2 << endl; break; case 3: cout << i << " bit is " << su.bits.bit3 << endl; break; case 4: cout << i << " bit is " << su.bits.bit4 << endl; break; case 5: cout << i << " bit is " << su.bits.bit5 << endl; break; case 6: cout << i << " bit is " << su.bits.bit6 << endl; break; case 7: cout << i << " bit is " << su.bits.bit7 << endl; break; case 8: cout << i << " bit is " << su.bits.bit8 << endl; break; case 9: cout << i << " bit is " << su.bits.bit9 << endl; break; case 10: cout << i << " bit is " << su.bits.bit10 << endl; break; case 11: cout << i << " bit is " << su.bits.bit11 << endl; break; case 12: cout << i << " bit is " << su.bits.bit12 << endl; break; case 13: cout << i << " bit is " << su.bits.bit13 << endl; break; case 14: cout << i << " bit is " << su.bits.bit14 << endl; break; } } // 单独处理符号位 cout << "15 bit is " << su.bits.bit15 << endl; cout << "Your number is: " << num << endl; } int main() { signed short num; cout << "Please, enter your number:"; cin >> num; print(num); ShortUnion su; su.num = num; // 通过位域直接判断符号位 if (su.bits.bit15 == 1) { cout << "Your number is negative" << endl; } else { cout << "Your number is positive" << endl; } return 0; }
关键细节说明
为什么用联合体?
联合体的所有成员共享同一块内存空间,所以当你给su.num赋值后,su.bits的每一位会自动对应signed short的二进制位,不需要手动做位运算转换。位域顺序的坑
C++标准没有规定位域的排列顺序(是从高位到低位还是低位到高位),这取决于编译器的端序。比如在GCC/Clang这类小端序编译器中,我们定义的bit0对应signed short的最低位;如果是大端序编译器,可能需要把bit15放在结构体的第一个位置。你可以测试输入-1(二进制全1),看bit15是否输出1来验证顺序。符号位的处理
我们把bit15定义为signed int类型,这样它会继承原signed short的符号属性——当数值为负时,bit15的值是1(或者说-1,因为signed位域的1会被解释为负数),但我们只需要判断它是否为非0,所以用unsigned int也可以,效果一样。位域成员不能数组索引
位域的成员是单独命名的,不能像数组那样用bits[i]访问,所以我用了switch来简化循环输出,你也可以手动逐行输出每一位,看哪种更符合你的需求。
内容的提问来源于stack exchange,提问作者Violet Khora
相关产品推荐
相关产品推荐

