连接按位运算的正确方法?

时间:2019-04-18 05:48:36

标签: c++

我需要连接一些按位运算,但是当前输出似乎是错误的。拆分后的操作与此类似:

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;

预先感谢您的任何建议。

2 个答案:

答案 0 :(得分:7)

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

问题在于(a << 4)被强制转换为int,因此(0x12 << 4) >> 4本质上是0x12

请参阅https://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion

答案 1 :(得分:2)

编译器未对>>和<<操作

应用积分促销

您可能会认为

    0   1
0   0   01-01-84
1   1   31-07-85
2   2   24-08-85
3   3   30-12-93
4   4   09-12-77
5   5   08-09-90
6   6   01-06-88
7   7   04-10-89
8   8   15-11-91
9   9   01-06-68


pd.to_datetime(data[1].apply(lambda x: '-'.join(x.split('-')[:-1] + ['19' + x.split('-')[2]])))


0   1984-01-01
1   1985-07-31
2   1985-08-24
3   1993-12-30
4   1977-09-12
5   1990-08-09
6   1988-01-06
7   1989-04-10
8   1991-11-15
9   1968-01-06
Name: 1, dtype: datetime64[ns]

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

您可以通过以下方法解决此问题:

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

同样,问题在于积分提升会保留位,直到最终转换为止。