C++ 移位语法错误

C++ 移位语法错误,c++,c,eclipse,optimization,arduino,C++,C,Eclipse,Optimization,Arduino,我有一个字节数组: byte data[2] 我想保留第一个的7个低有效位和第二个的3个最高有效位。 我这样做: unsigned int the=((data[0]<<8 | data[1])<<1)>>6; unsigned int=((数据[0] 保留第一个的7个低有效位和第二个的3个最高有效位 假设要保留的10位应该是unsigned int值的LSB,并且应该是连续的,并且3位应该是结果的LSB,这应该可以完成以下工作: unsigned int

我有一个字节数组:

byte data[2]
我想保留第一个的7个低有效位和第二个的3个最高有效位。 我这样做:

unsigned int the=((data[0]<<8 | data[1])<<1)>>6;
unsigned int=((数据[0]
保留第一个的7个低有效位和第二个的3个最高有效位

假设要保留的10位应该是
unsigned int
值的LSB,并且应该是连续的,并且3位应该是结果的LSB,这应该可以完成以下工作:

unsigned int value = ((data[0] & 0x7F) << 3) | ((data[1] & 0xE0) >> 5);
unsigned int value=((数据[0]&0x7F)>5);
您可能不需要所有屏蔽操作数;它部分取决于
字节的定义(可能是
无符号字符
,或者在
字符
无符号的机器上可能是纯
字符
),但写入的内容应该在任何地方都可以工作(16位、32位或64位
int
;有符号或无符号8位)(或
字节的16位、32位或64位)值

您的代码在任何时候都不会从
数据[0]
中删除高位,除非您所在的平台上的
unsigned int
是16位值,但如果是这样的话,那么现在就已经不寻常了,需要进行注释

保留第一个的7个低有效位和第二个的3个最高有效位

假设要保留的10位应该是
unsigned int
值的LSB,并且应该是连续的,并且3位应该是结果的LSB,这应该可以完成以下工作:

unsigned int value = ((data[0] & 0x7F) << 3) | ((data[1] & 0xE0) >> 5);
unsigned int value=((数据[0]&0x7F)>5);
您可能不需要所有屏蔽操作数;它部分取决于
字节的定义(可能是
无符号字符
,或者在
字符
无符号的机器上可能是纯
字符
),但写入的内容应该在任何地方都可以工作(16位、32位或64位
int
;有符号或无符号8位)(或
字节的16位、32位或64位)值

您的代码在任何时候都不会从
数据[0]
中删除高位,除非您所在的平台上的
unsigned int
是一个16位的值,但如果是这样的话,这在现在已经不寻常了,因此有理由发表评论。

  • 你能给我一个提示为什么这不起作用吗
提示:

您有两个字节,希望保留第一个字节中的7个低有效位和第二个字节中的3个最高有效位:

data[0]: -xxxxxxx    data[1]: xxx-----
-'s表示要删除的位,x表示要保留的位

此后

(data[0]<<8 | data[1])<<1
然后进行
>6
,结果是:

the: 00000000 00000000 00000-xx xxxxxxxx
请参阅,您没有从数据[0]中删除高位。

  • 你能给我一个提示为什么这不起作用吗
提示:

您有两个字节,希望保留第一个字节中的7个低有效位和第二个字节中的3个最高有效位:

data[0]: -xxxxxxx    data[1]: xxx-----
-'s表示要删除的位,x表示要保留的位

此后

(data[0]<<8 | data[1])<<1
然后进行
>6
,结果是:

the: 00000000 00000000 00000-xx xxxxxxxx

请看,您没有从数据[0]中删除高位。

@chris否,整数提升。如果
字节有符号且
数据[0]为UB<0
@DanielFischer,说得好,我忘了。棘手的语言很棘手:pso我想我错过了这个角色?错误消息是什么?@rahulmaindargi否,两个打开,两个关闭。@chris否,整数升级。如果
字节
有符号且
数据[0]是UB<0
@DanielFischer,说得好,我忘了。棘手的语言很棘手:pso我想我错过了这个角色?错误信息是什么?@rahulmaindargi不,两个打开,两个关闭。