从8位值获取最重要的位

时间:2013-11-01 19:23:48

标签: c++ binary endianness

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

到目前为止:

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

Ex:11000010是我的数据字节。 (小端)

我需要做的是确定最高有效位(MSB),在这种情况下是11,是00,01,10,11还是其他一些东西。

到目前为止,我已经得到了将字节输出为11000010(存储在字符串中)并尝试从中提取11的程序。 (如果我可以解决这个问题,那么创建一个switch case或if语句来检查我自己的内容是否足够简单)。

**我对C ++的态度不是很好,这就是我要求帮助的原因。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:3)

您似乎想要获得前两个最重要位的值。

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

unsigned char input;
unsigned char output;

input = whatever_you_want;

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

答案 2 :(得分: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数据类型的签名是特定于编译器和平台的,并且可能受编译器选项的影响。