1

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

                      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',这没有任何意义。

4

3 回答 3

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 (theapdu_parse will be taken) if[0]` 设置了它的第 3 位。

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

我会把它写成:

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

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

于 2014-06-05T13:25:45.650 回答
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
于 2014-06-05T13:25:36.417 回答
0
mpdu->segmented_message = (apdu_parse[0] & (1<<3)) >> 3
于 2014-06-05T13:27:28.113 回答