0

我有一个字节数组:

byte data[2]

我想保留第一个的 7 个较低有效位和第二个的 3 个最高有效位。我这样做:

unsigned int the=((data[0]<<8 | data[1])<<1)>>6;

你能告诉我为什么这不起作用吗?如果我以不同的方式进行操作,则效果很好。

4

2 回答 2

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 位、32 位或 64 位int;有符号或无符号的 8 位(或 16 -bit,或 32 位,或 64 位)值byte)。

您的代码在任何时候都不会删除高位data[0]- 除非您在unsigned int一个 16 位值的平台上,但如果是这种情况,那么这些天来需要评论是不寻常的。

于 2013-05-23T16:31:56.927 回答
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

看,您没有从 data[0] 中删除高位。

于 2013-05-23T18:22:34.160 回答