【问题标题】:Shifting syntax error移位语法错误
【发布时间】:2013-05-19 02:38:39
【问题描述】:

我有一个字节数组:

byte data[2]

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

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

你能告诉我为什么这不起作用吗? 如果我在不同的行中这样做,效果很好。

【问题讨论】:

  • @chris 不,整数促销。如果 byte 已签名且 data[0] &lt; 0 是 UB。
  • @DanielFischer,好点,我忘了。棘手的语言很棘手:p
  • 所以我想我想念的是演员?
  • 错误信息是什么?
  • @rahulmaindargi 不,两个打开,两个关闭。

标签: c++ c eclipse optimization arduino


【解决方案1】:
  • 你能告诉我为什么这不起作用吗?

提示:

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

data[0]: -xxxxxxx    data[1]: xxx-----

- 代表要删除的位,x 代表要保留的位。

之后

(data[0]<<8 | data[1])<<1

你有:

the: 00000000 0000000- xxxxxxxx xx-----0

然后你创建&gt;&gt;6,结果是:

the: 00000000 00000000 00000-xx xxxxxxxx

看,你没有从 data[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 位、32 位或64 位) -bit intbyte 的有符号或无符号 8 位(或 16 位、32 位或 64 位)值。

    您的代码在任何时候都不会从 data[0] 中删除高位 — 除非您所在的平台可能 unsigned int 是 16 位值,但如果是这种情况,那就太不寻常了这几天值得发表评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多