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_t
是 0b0000000000000001
,因此当您向左移动 ledNumber-1
数量时,结果是 uint16_t
并设置了一位到 ledNumber
指定的位置。
从变量名ledNumber
,我猜测这个函数设置了一个特定的 LED 来工作。
|
对传递给它的两个操作数执行按位或运算。
例如,
byte b = 0x0A | 0x50;
如果您查看 0x0A
和 0x50
的基础位,它们分别是 0b00001010
和 0b01010000
。当与 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));
}
你能告诉我 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_t
是 0b0000000000000001
,因此当您向左移动 ledNumber-1
数量时,结果是 uint16_t
并设置了一位到 ledNumber
指定的位置。
从变量名ledNumber
,我猜测这个函数设置了一个特定的 LED 来工作。
|
对传递给它的两个操作数执行按位或运算。
例如,
byte b = 0x0A | 0x50;
如果您查看 0x0A
和 0x50
的基础位,它们分别是 0b00001010
和 0b01010000
。当与 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));
}