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

时间:2016-11-11 15:53:28

标签: c hex bit-shift

你能告诉我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);
}

3 个答案:

答案 0 :(得分:3)

<<向左移位。二进制uint16_t的{​​{1}}为1,因此当您向左移动数量0b0000000000000001时,结果为ledNumber-1,其中包含一位数到uint16_t指定的位置。

从变量名ledNumber开始,我猜这个函数设置了一个特定的LED来处理。

ledNumber对传递的两个操作数执行按位OR。

例如,

|

如果查看byte b = 0x0A | 0x50; 0x0A的基础位,它们分别为0x500b00001010。与OR运算符结合使用时,0b01010000中的结果为b,或十六进制为0b01011010

0x5A是一个按位OR赋值。 |=类似于|=+=之类的运算符,因为它将对两个操作数执行按位OR,然后将结果存储在左运算符中。

-=

答案 1 :(得分:2)

cppreference - Arithmetic operators救援

  

按位移位运算符表达式具有形式
  lhs&lt;&lt; rhs(1)
  lhs&gt;&gt; rhs(2)
  1)由rhs位左移lhs   2)通过rhs位右移lhs

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

0x0001 << (5 - 1)

将成为

0x0010

另外cppreference - Assignment operators

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

*ledsAddress |= convertLedNumberToBit(ledNumber);

相当于

*ledsAddress = *ledsAddress | convertLedNumberToBit(ledNumber);

答案 2 :(得分:2)

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

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

Ex:(ledNumber = 4)=&gt;返回值为b0000000000001000 = 0x0008

然后调用|= convertLedNumberToBit(ledNumber)将仅强制将ledNumber位置为'1'而不用二进制OR来改变其他位。

例如:(led1,led3&amp; led7为'ON') 在OR b0000000001000101 = 0x0045之前。 LedDriver_TurnOn(4)=&gt; b0000000000001000 = 0x0008 在OR之后b0000000001001101 = 0x004D

  

要将相同的LED切换为“OFF”,您只需通过NOT掩码的AND功能替换OR功能。

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