在中断子程序(每 5 µs 调用一次)中,我需要检查一个字节的 MSB 并将其复制到该字节的其余部分。

我需要做类似的事情:

if(MSB == 1){byte = 0b11111111}
else{byte = 0b00000000}

我需要它使它像在中断子例程上一样快,而且上面还有更多代码,因此调用效率很高。

因此,我不想使用任何 if、switch、select 或 >> 操作数,因为我认为它会减慢进程。如果我错了,那么我会走“简单”的道路。

我试过的:
byte = byte & 0b100000000

这给了我 0b100000000b00000000

但我需要第一个是 0b11111111

我想我在某处(加上其他门)遗漏了一个 OR。我不知道,我的直觉告诉我这应该很容易,但目前不适合我。

最佳答案

诀窍是对 int8_t 变量使用有符号类型,例如 byte ,并利用右移操作的符号扩展功能:

byte = byte >> 7;

Demo.

右移速度非常快——在大多数现代(甚至不那么现代)的 CPU 上都是一条指令。

这样做的原因是有符号操作数上的 >> 在左侧插入符号位以保留其操作数的符号。这称为符号扩展。

注意: 从技术上讲,此行为是实现定义的,因此不是普遍可移植的。谢谢 Eugene Sh. 的评论和 reference

关于c - 如何将 MSB 复制到字节的其余部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37218006/

10-12 07:36