从字节中检索位

时间:2014-06-05 13:22:39

标签: c bit-shift byte-shifting

嘿所以我想知道是否有人可以解释这是如何工作的,我必须从一个字节中检索第3位,这是一个bool值,我对这实际如何工作感到困惑,如果我的语法正确。我一直在谈论如何做到这一点的许多不同的例子。这就是我所拥有的:

                      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; 93&#39;没有意义。

3 个答案:

答案 0 :(得分:1)

第一部分是正确的,但第二部分是错误的。

此:

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

表示&#34; if apdu_parse[0] bitwise-AND:ed with 8 isn't zero", which is fine. It will be true (the如果will be taken) if apdu_parse [0]`的第3位设置。

另一半虽然没有任何意义;没有按位与-ON与0是非零的。

我会把它写成:

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

这里与0进行显式比较,以创建true / false值,我认为这比隐含它更清晰。

答案 1 :(得分:0)

您可以简单地写一下:

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

答案 2 :(得分:0)

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