c++ - 掩蔽和转移

标签 c++ c

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

  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

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

关于c++ - 掩蔽和转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30364613/

相关文章:

C++:std::cout 的顺序

c - 这是否违反了严格的别名规则?

c - 如何将值传递给结构体的指针成员

c - 在C中,为什么仅改变循环边界后结果不同?

无法识别代码错误,测试用例失败

c++ - 否定后缀不正确且可交流

c++ - 下面的语句如何评价?

c++ - 指针 vector 和值 vector 之间的差异

c++ - 在 OpenGL 中填充自相交多边形

配置 $(CC) 以在可以安全删除包含时发出警告