2

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

至今:

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

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

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

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

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

任何帮助是极大的赞赏。

4

3 回答 3

7

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

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
}
于 2013-11-01T19:29:22.303 回答
3

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

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

unsigned char input;
unsigned char output;

input = whatever_you_want;

output = input & 0xc0; //0xc00 = 0b11000000
output = output >> 6;
于 2013-11-01T19:29:52.087 回答
3

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

其次,您需要两个最高有效位,而不是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;

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

于 2013-11-01T19:30:48.090 回答