遮罩和移位

Masking and shifting

本文关键字:      更新时间:2023-10-16

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

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

试着用实数来处理这些例子。在本例中,您将发现它们不会产生相同的输出。

我们将使用两个例子。

首先,假设loc_Task_value_avg等于0x1234

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

((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

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

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

这取决于你要移动的值的大小,掩码中的位数以及底层值是有符号的还是无符号的。

右移等于除以2。对于有符号值,这意味着符号位将被保留(因为底层表示很可能是双互补)。如果您的移位足够大,可以将复制的符号位移位到掩码结果中,则会产生差异。

如果底层值是无符号的,无论你是先移动掩码还是先移动掩码

每一种情况都会有不同的结果。

1101位为例。

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

另一方面,如果我移动一位,然后掩码第二位,我将得到值1

清楚地知道你到底想做什么,然后从那里开始做,这是很重要的。
相关文章:
  • 没有找到相关文章