在一个中断子程序(每5μs调用一次)中,我需要检查一个字节的MSB并将其复制到该字节的其余部分。
我需要做类似的事情:
if(MSB == 1){byte = 0b11111111}
else{byte = 0b00000000}
我需要它来使它快速,因为它在一个中断子程序上,并且还有更多的代码,所以效率就是调用。
因此,我不想使用任何if,switch,select和>>
操作数,因为我感觉它会减慢进程的速度。如果我错了,那么我将采用“简单”的方式。
我尝试了什么:
byte = byte & 0b100000000
这会给我0b10000000
或0b00000000
。
但我需要第一个0b11111111
。
我想我在某个地方(以及其他大门)错过了一个OR。我不知道,我的胆量告诉我这应该很容易,但现在不适合我。
答案 0 :(得分:3)
编辑:我的回答让人感到困惑,因为我没有指定无符号字节。我的假设是B
属于unsigned char
类型。正如下面的一条评论所述,我可以省略&1
。这没有其他海报提出的有符号字节解决方案那么快,但这段代码应该是可移植的(一旦理解为B
是无符号类型)。
B = -((B >> 7)&1)
负数我们是朋友。顺便说一下,移位应该很快。
答案 1 :(得分:3)
诀窍是为int8_t
变量使用签名类型(例如byte
),并利用右移操作的符号扩展功能:
byte = byte >> 7;
向右移动非常快 - 在大多数现代(甚至不那么现代)的CPU上都有一条指令。
这样做的原因是签名操作数上的>>
在左侧插入符号位以保留其操作数的符号。这称为符号扩展名。
注意:从技术上讲,此行为是实现定义的,因此不是普遍可移植的。感谢Eugene Sh.,评论和reference。
答案 2 :(得分:0)
MSB实际上是数字的符号位。负数为1,正数为0。 所以最简单的方法是
if(byte < 0)
{
byte = -1;
}
else
{
byte = 0;
}
因为-1 = 11111111,二进制。
如果是无符号整数的情况,那么只需将其强制转换为有符号值,然后再按上述方法对其进行比较。