C BitWise - “1 << (num - 1)”和“|=”有什么作用?

C BitWise - What does "1 << (num - 1)" and "|=" do?

你能告诉我 convertLedNumberToBit 和 LedDriver_TurnOn 是做什么的吗?我不明白 1 << (num - 1)|=

发生了什么
static uint16_t * ledsAddress;

static uint16_t convertLedNumberToBit(int ledNumber)
{
    return  1 << (ledNumber - 1);
}
void LedDriver_TurnOn(int ledNumber)
{
    *ledsAddress |= convertLedNumberToBit(ledNumber);
}

<< 是按位向左移动。 1 的二进制 uint16_t0b0000000000000001,因此当您向左移动 ledNumber-1 数量时,结果是 uint16_t 并设置了一位到 ledNumber 指定的位置。

从变量名ledNumber,我猜测这个函数设置了一个特定的 LED 来工作。

| 对传递给它的两个操作数执行按位或运算。

例如,

byte b = 0x0A | 0x50;

如果您查看 0x0A0x50 的基础位,它们分别是 0b000010100b01010000。当与 OR 运算符组合时,b 中的结果是 0b01011010,或十六进制的 0x5A

|= 是按位或赋值。 |= 类似于 +=-= 等运算符,因为它将对两个操作数执行按位或,然后将结果存储在左侧运算符中。

byte b = 0x0A;
b |= 0x50;

// after this b = 0x5A

cppreference - Arithmetic operators 救援

The bitwise shift operator expressions have the form
lhs << rhs (1)
lhs >> rhs (2)
1) left shift of lhs by rhs bits
2) right shift of lhs by rhs bits

所以1 << (ledNumber - 1)将最低有效位向左移动,例如如果 ledNumber = 5

0x0001 << (5 - 1)

会变成

0x0010

还有cppreference - Assignment operators

|= 是(按位或)赋值运算符,其中

*ledsAddress |= convertLedNumberToBit(ledNumber);

等同于

*ledsAddress = *ledsAddress | convertLedNumberToBit(ledNumber);

要在 I/O 端口 ledsAddress 切换 'ON' LED[ledNumber],需要将等效位设置为“1”。但是,当更改 I/O 端口值时,您必须保持所有其他 LED 的状态仍然 'ON'。

convertLedNumberToBit(int ledNumber) 使用掩码 b0000000000000001(16 位)通过切换到 (ledNumber-1) 的左侧将 ledNumber 位设置为“1”{ 当 ledNumber 为 1 时不需要移位.

例如:(ledNumber = 4) => 返回值为 b0000000000001000= 0x0008

然后调用 |= convertLedNumberToBit(ledNumber) 将仅将 ledNumber 位强制为“1”,而不会通过二进制或更改其他位。

例如:(led1、led3 和 led7 是 'ON') 在 OR b0000000001000101 = 0x0045 之前。 LedDriver_TurnOn(4) => b0000000000001000= 0x0008 在 OR b0000000001001101 = 0x004D.

之后

To switch 'OFF' the same LED, you have just to replace the OR function by the AND function of the NOT mask.

void LedDriver_TurnOff(int ledNumber)
{
    *ledsAddress &= ~(convertLedNumberToBit(ledNumber));
}