如何将MSB复制到字节的其余部分?

时间:2016-05-13 19:32:26

标签: c bit-manipulation microcontroller interrupt

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

我需要做类似的事情:

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

我需要它来使它快速,因为它在一个中断子程序上,并且还有更多的代码,所以效率就是调用。

因此,我不想使用任何if,switch,select和>>操作数,因为我感觉它会减慢进程的速度。如果我错了,那么我将采用“简单”的方式。

我尝试了什么:

byte = byte & 0b100000000

这会给我0b100000000b00000000

但我需要第一个0b11111111

我想我在某个地方(以及其他大门)错过了一个OR。我不知道,我的胆量告诉我这应该很容易,但现在不适合我。

3 个答案:

答案 0 :(得分:3)

编辑:我的回答让人感到困惑,因为我没有指定无符号字节。我的假设是B属于unsigned char类型。正如下面的一条评论所述,我可以省略&1。这没有其他海报提出的有符号字节解决方案那么快,但这段代码应该是可移植的(一旦理解为B是无符号类型)。

 B = -((B >> 7)&1)

负数我们是朋友。顺便说一下,移位应该很快。

答案 1 :(得分:3)

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

byte = byte >> 7;

Demo.

向右移动非常快 - 在大多数现代(甚至不那么现代)的CPU上都有一条指令。

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

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

答案 2 :(得分:0)

MSB实际上是数字的符号位。负数为1,正数为0。 所以最简单的方法是

if(byte < 0)
{
    byte = -1;
}
else
{
    byte = 0;
}

因为-1 = 11111111,二进制。

如果是无符号整数的情况,那么只需将其强制转换为有符号值,然后再按上述方法对其进行比较。