-9

我有一个 Arduino 草图,它基本上是 c++,其中包含以下代码行:

uint32_t cardid = uid[0];
cardid <<= 8;
cardid |= uid[1];

Arduino 连接到 pn532 RFID 阅读器,因此基本上它会扫描范围内的卡并在其上打印 UID。
但我无法理解运算符 |= 和 <<= 的作用。
我在网上发现它们与 valarrays 有关系,但我从未使用过这样的东西。

4

3 回答 3

3

通常,这些运算符是快捷方式:

a <<= b   -->   a = a << b
a |= b    -->   a = a | b

在给定的示例中,此代码从两个 8 位值生成一个 16 位值。给定

uid[0] = 0x12
uid[1] = 0x34

然后

uint32_t cardid = uid[0];  // cardid is now 0x12
cardid <<= 8;              // shifts the value 8 bits to the left -> 0x1200
cardid |= uid[1];          // applies the OR operator -> 0x1200 | 0x34 = 0x1234
于 2017-02-05T11:17:28.430 回答
1

C ++允许+= *= |= &= ...在您的情况下,第一个<<=称为right shift assignment运算符,它是移动相同 lValue 的位然后将结果分配给它本身的快捷方式:

int a = 7;
a <<= 2;
a = a << 2; // This line is identical to the one above.

第二个|=称为Bitwise Or Assignment运算符,它是对相同 lValue 的位进行按位或运算的快捷方式,然后将结果分配给它本身:

int a = 7;
a |= 2;
a = a | 2; // This line is identical to the one above.
  • 两个运算符都在位上工作。
于 2017-02-05T13:26:10.997 回答
0

这些是按位运算符(写为快捷方式)。

卡片 <<= 8; 等同于cardid = (cardid << 8); 这会进行算术左移,在这种情况下本质上是乘以 2^8。

cardid |= uid[1]; 等同于cardid = (cardid | uid[1]); 这执行按位或,也就是说,它设置在 cardid 中的位中,这些位也在 uid 中设置。

于 2017-02-05T12:43:32.403 回答