我们应该先移动值然后掩码还是其他方式?在转移之前先掩蔽有什么风险?
((loc_Task_value_avg >> 8) & 0x00FF)
或者((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
我们得到两个单独输出的原因是因为在处理有符号值(二进制补码)时,从最高位值转移到最低位值可能会导致符号位被扩展。是否发生这种情况取决于编译器的指令是使用有符号移位还是无符号移位。
关于c++ - 掩蔽和转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30364613/