在中断子程序(每 5 µs 调用一次)中,我需要检查一个字节的 MSB 并将其复制到该字节的其余部分。
我需要做类似的事情:
if(MSB == 1){byte = 0b11111111}
else{byte = 0b00000000}
我需要它使它像在中断子例程上一样快,而且上面还有更多代码,因此调用效率很高。
因此,我不想使用任何 if、switch、select 或
>>
操作数,因为我认为它会减慢进程。如果我错了,那么我会走“简单”的道路。我试过的:
byte = byte & 0b100000000
这给了我
0b10000000
或 0b00000000
。但我需要第一个是
0b11111111
。我想我在某处(加上其他门)遗漏了一个 OR。我不知道,我的直觉告诉我这应该很容易,但目前不适合我。
最佳答案
诀窍是对 int8_t
变量使用有符号类型,例如 byte
,并利用右移操作的符号扩展功能:
byte = byte >> 7;
Demo.
右移速度非常快——在大多数现代(甚至不那么现代)的 CPU 上都是一条指令。
这样做的原因是有符号操作数上的
>>
在左侧插入符号位以保留其操作数的符号。这称为符号扩展。注意: 从技术上讲,此行为是实现定义的,因此不是普遍可移植的。谢谢 Eugene Sh. 的评论和 reference 。
关于c - 如何将 MSB 复制到字节的其余部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37218006/