【发布时间】:2016-05-13 19:32:26
【问题描述】:
在中断子程序(每 5 µs 调用一次)中,我需要检查一个字节的 MSB 并将其复制到该字节的其余部分。
我需要做类似的事情:
if(MSB == 1){byte = 0b11111111}
else{byte = 0b00000000}
我需要它让它快,因为它在一个中断子程序上,而且上面还有一些代码,所以效率正在调用。
因此,我不想使用任何 if、switch、select 或 >> 操作数,因为我认为它会减慢进程。如果我错了,那我就走“简单”的路。
我尝试过的:
byte = byte & 0b100000000
这给了我0b10000000 或0b00000000。
但我需要第一个成为0b11111111。
我想我在某处(加上其他门)错过了一个 OR。我不知道,我的直觉告诉我这应该很容易,但现在不适合我。
【问题讨论】:
-
你展示的条件确实够用了。而且它将比任何位黑客更具可读性。
-
您使用的是 C 语言吗?或者,您是在 asm 中执行此操作吗?如果您使用带符号的右移方法,请查看微控制器的 ISA 参考手册以获取算术右移操作码,以确保 [它可能有效]。或者,只需创建一个测试用例。在 C 中,只需反汇编代码以确保获得预期的操作码。
-
@Craig Estey:我正在使用 C。谢谢,我记住了。
-
@Eugene Sh:因为它在中断子程序中,所以速度比清晰度更宝贵。如果没有,我会选择有条件的。
-
刚刚在 x86 上对此进行了测试,使用 -O2 执行
m = (m & 0x80) ? 0xFF : 0x00将导致优化器生成单个sarinst(即它想通了)。我认为这很可能是因为我之前已经看到过类似的“针孔”优化,用于类似这样的有用/常见构造。因此,具有讽刺意味的是,您的 first 代码示例将生成最佳代码 ...
标签: c bit-manipulation microcontroller interrupt