我知道在这个网站上有类似的问题,但是,我似乎无法找到真正帮助我解决问题的东西。
到目前为止:
我有1字节(8位),可以是1和0的任意组合。
Ex:11000010是我的数据字节。 (小端)
我需要做的是确定最高有效位(MSB),在这种情况下是11,是00,01,10,11还是其他一些东西。
到目前为止,我已经得到了将字节输出为11000010(存储在字符串中)并尝试从中提取11的程序。 (如果我可以解决这个问题,那么创建一个switch case或if语句来检查我自己的内容是否足够简单)。
**我对C ++的态度不是很好,这就是我要求帮助的原因。
非常感谢任何帮助。
答案 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
数据类型的签名是特定于编译器和平台的,并且可能受编译器选项的影响。