连接按位运算的正确方法

Correct way to concatenate bitwise operations?

本文关键字:方法 运算 连接      更新时间:2023-10-16

我需要连接一些按位运算,但当前输出似乎是错误的。拆分操作类似于以下内容:

unsigned char a = 0x12
unsigned char x = 0x00;
x = a << 4;
x = x >> 4;

预期成果 x = 0x02;当前结果 x = 0x02;

如果我尝试连接操作,结果不正确:

unsigned char a = 0x12
unsigned char x = 0x00;
x = (a << 4) >> 4;

预期成果 x = 0x02;当前结果 x = 0x12;

提前感谢您的任何建议。

问题是(a << 4)被转换为 int(通过积分提升(,所以(0x12 << 4) >> 4本质上是0x12

您要做的是使用static_cast(a << 4)转换回unsigned char

最终代码:

   unsigned char a = 0x12;
   unsigned char x = 0x00;
   x = static_cast<unsigned char>(a << 4) >> 4;   
编译器

未对>>和<<操作应用积分提升

你可能会认为

x = (a << 4) >> 4;

将使用字节宽的寄存器进行操作,但编译器在执行移位之前将 char a 提升为 int,保留向左移动的位。

您可以通过执行以下操作来解决此问题:

x = ((a << 4) & 0xff) >> 4;

同样,问题是整体推广会保留位直到最终演员表。