我有一个字节数组:
byte data[2]
我想保留来自第一个的7个较低有效位和来自第二个的3个最高有效位。 我这样做:
unsigned int the=((data[0]<<8 | data[1])<<1)>>6;
你能给我一个提示,为什么这不起作用? 如果我在不同的行中执行它可以正常工作。
答案 0 :(得分:2)
保留来自第一个的7个较低有效位和来自第二个的3个最高有效位。
假设要保留的10位应该是unsigned int
值的LSB,并且应该是连续的,并且3位应该是结果的LSB,这应该可以完成这项工作:
unsigned int value = ((data[0] & 0x7F) << 3) | ((data[1] & 0xE0) >> 5);
您可能不需要所有屏蔽操作数;它部分取决于byte
的定义(可能是unsigned char
,或者在char
未签名的机器上可能是普通的char
),但所写的内容应该适用于任何地方(16 -bit,32位或64位int
; byte
的有符号或无符号8位(或16位,或32位或64位)值。
您的代码在任何时候都不会从data[0]
删除高位 - 除非您可能位于unsigned int
为16位值的平台上,但如果是这样的话,这些日子不足以保证评论。
答案 1 :(得分:2)
提示:
你有两个字节,并希望保留第一个中7个较低有效位和第二个中最重要的3个位:
data[0]: -xxxxxxx data[1]: xxx-----
- 表示要删除的位,x表示要保留的位。
在此之后
(data[0]<<8 | data[1])<<1
你有:
the: 00000000 0000000- xxxxxxxx xx-----0
然后你制作>>6
,结果是:
the: 00000000 00000000 00000-xx xxxxxxxx
请注意,您没有从数据[0]中删除高位。