我有一个字节数组:
byte data[2]
我想保留第一个的 7 个较低有效位和第二个的 3 个最高有效位。我这样做:
unsigned int the=((data[0]<<8 | data[1])<<1)>>6;
你能告诉我为什么这不起作用吗?如果我以不同的方式进行操作,则效果很好。
我有一个字节数组:
byte data[2]
我想保留第一个的 7 个较低有效位和第二个的 3 个最高有效位。我这样做:
unsigned int the=((data[0]<<8 | data[1])<<1)>>6;
你能告诉我为什么这不起作用吗?如果我以不同的方式进行操作,则效果很好。
保留第一个的 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 位、32 位或 64 位int
;有符号或无符号的 8 位(或 16 -bit,或 32 位,或 64 位)值byte
)。
您的代码在任何时候都不会删除高位data[0]
- 除非您在unsigned int
一个 16 位值的平台上,但如果是这种情况,那么这些天来需要评论是不寻常的。
暗示:
您有两个字节,并希望保留第一个字节的 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
看,您没有从 data[0] 中删除高位。