从 8 位值中获取最高有效位

Get the most significant bit from an 8-bit value

本文关键字:有效位 获取      更新时间:2023-10-16

我知道这个网站上有类似的问题,但是,我似乎找不到真正帮助我解决我遇到的问题的东西。

迄今:

我有 1 字节(8 位),可以是 1 和 0 的任意组合。

例如:11000010是我的数据字节。(小端序)

我需要做的是确定最高有效位 (MSB),在本例中为 11,是否为 00、01、10、11,然后从那里做一些其他事情。

到目前为止,我已经让程序将 Byte 输出为 11000010(存储在字符串中),并尝试从中提取 11。 (如果我能弄清楚,那么创建一个开关大小写或 if 语句来检查我自己的内容是否足够简单)。

**我对C++不太好,这就是我寻求帮助的原因。

任何帮助将不胜感激。

您不需要将其存储为字符串,只需使用按位运算符:

unsigned char myByte = 0xc2; // 11000010
char twoMost = (myByte & 0xff) >> 6; // 00000011

0xff仅"选择"(掩码)前 8 位,因此如果 char 类型实际上大于 8 位,则丢弃其他所有内容。

通过将 6 位向右移动,您可以只保留最重要的两个位。然后,您可以应用如下switch

switch(twoMost) {
    case 0: // 00
        doSomething();
        break;
    case 1: // 01
        doSomething();
        break;
    case 2: // 10
        doSomething();
        break;
    case 3: // 11
        doSomething();
        break;
    default:
        // This is not possible, but better output an error message
}

似乎您想获取前两个最高有效位的值。

这可以通过过滤掉它们并将值向左移动 6 位来完成:

unsigned char input;
unsigned char output;
input = whatever_you_want;
output = input & 0xc0; //0xc00 = 0b11000000
output = output >> 6;

首先,字节序与单词中的字节顺序有关,而不是与字节中位的顺序有关。

其次,您需要两个最高有效位,而不是 MSB

也就是说,这是代码:

unsigned char c = Something(); //That's your byte; comes from somewhere
unsigned char x = c >> 6;

因此,如果 MSB 为 11,则 x 的值将为 3。如果是 10,则为 2。如果为 01,则为 1。如果为 00,则为 0。

变量的Unsigned性很重要;它使>>运算符的行为像按位移位,而不是算术移位。对于 signed char 变量,您需要以下表达式:

char x = (c >> 6) & 3;

原版char数据类型的有符号性特定于编译器和平台,并且可能受到编译器选项的影响。