【问题标题】:retrieving bits from bytes从字节中检索位
【发布时间】:2014-06-05 13:22:38
【问题描述】:

嘿,所以我想知道是否有人可以解释这是如何工作的,我必须从一个字节中检索第三位,它是一个布尔值,我对它的实际工作原理感到困惑,如果我有语法正确。我不断提出很多不同的例子来说明如何做到这一点。这就是我所拥有的:

                      if(apdu_parse[0] & (1<<3)){

                                 apdu_bit3 = 1;
                      }
                      else if(apdu_parse[0] & (0<<3)){

                                 apdu_bit3 = 0;
                      }                        
                    mpdu -> segmented_message = apdu_bit3;

我认为这样做是寻找 apdu_parse[0] 的第三位来确定它是 1 还是 0 并相应地存储它。正如我所说,我不断遇到很多不同的例子,我认为我开始将它们混合起来,但没有任何效果。 apdu_parse[0] 中的值是一个十六进制值,我一直得到 '93' 这没有任何意义。

【问题讨论】:

  • 请告诉我们apdu_parseapdu_bit3mpdu-&gt;segmented_message 是如何定义的(它们的类型是什么)以及如何打印结果?
  • (0&lt;&lt;3)O_ó 这应该是什么意思?
  • @Pavel:没必要回答他/她的问题。
  • 为什么不只是apdu_bit3 = (apdu_parse[0] &gt;&gt; 3) &amp; 1;

标签: c bit-shift byte-shifting


【解决方案1】:

前半句是对的,后半句是错的。

这个:

if(apdu_parse[0] & (1<<3)){
    apdu_bit3 = 1;
}

表示“如果apdu_parse[0] bitwise-AND:ed with 8 isn't zero", which is fine. It will be true (theifwill be taken) ifapdu_parse[0]`设置了第三位。

另一半虽然没有任何意义;与 0 进行按位与运算后,没有什么是非零的。

我会这样写:

mpdu->segmented_message = (apdu_parse[0] & (1 << 3)) != 0;

这里与 0 进行显式比较,以创建 true/false 值,我认为这比隐含要干净得多。

【讨论】:

    【解决方案2】:
    mpdu->segmented_message = (apdu_parse[0] & (1<<3)) >> 3
    

    【讨论】:

      【解决方案3】:

      你可以简单地写:

      mpdu->segmented_message = (apdu_parse[0] >> 3) & 1;
      

      如果设置了该位,您的代码将设置正确的值,但如果未设置该位,您的代码将设置错误的值。

      apdu_parse[0] & (0<<3)
      

      将始终生成 0。

      这样

      if (adpu_parse[0] & (0<<3))
      

      永远是假的,因为

      Value AND 0 EQUALS 0
      

      【讨论】:

        猜你喜欢
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 2015-03-02
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        相关资源
        最近更新 更多