掩盖和转移

时间:2015-05-21 04:30:13

标签: c++ c

我们应该首先移动值然后屏蔽还是其他方式?转移之前首次掩蔽的风险是什么?

  1. ((loc_Task_value_avg >> 8) & 0x00FF) OR
  2. ((loc_Task_value_avg & 0xFF00) >> 8)

3 个答案:

答案 0 :(得分:2)

每个案例都会做不同的事情。

以位1101为例。

如果我屏蔽第二位(零)然后将其移一,那么我将得到值0

另一方面,如果我将位移一位然后屏蔽第二位,我将得到值1

重要的是要清楚地确定你打算做什么,然后从那里开始。

答案 1 :(得分:2)

尝试使用实数来处理这些示例。在这种情况下,您会发现它们不会产生相同的输出。

我们将使用两个例子。

首先,假设loc_Task_value_avg等于0x1234

((loc_Task_value_avg >> 8) & 0x00FF)
((0x1234 >> 8 ) & 0x00FF)
(0x0012 & 0x00FF)
0x0012

VS

((loc_Task_value_avg & 0xFF00) >> 8)
((0x1234 & 0xFF00) >> 8)
(0x0012 >> 8)
0x0012

当我们使用签名值时会出现危险。我们使用0xFEDC。

((loc_Task_value_avg >> 8) & 0x00FF)
((0xFEDC >> 8 ) & 0x00FF)
(0xFFFE & 0x00FF)
0x00FE

VS

((loc_Task_value_avg & 0xFF00) >> 8)
((0xFEDC & 0xFF00) >> 8)
(0xFE00 >> 8)
0xFFFE

我们获得两个单独输出的原因是因为在处理有符号值(二进制补码)时,从最高位到高位的值移位可能导致符号位被扩展。是否发生这种情况取决于编译器的指令是使用有符号还是无符号移位。

答案 2 :(得分:1)

它取决于要移位的值的大小,掩码中的位数以及基础值是有符号还是无符号。

右移是除以2.在有符号值上,这意味着符号位将被保留(因为基础表示很可能是两个恭维)。如果你的移位足够大,可以将复制的符号位移到掩码结果中,那么它就会有所不同。

如果基础值是无符号的,那么移动然后移动掩码或掩码然后移位无关紧要。