将一个字节转换为 8 个布尔值
Convert a byte to 8 booleans
我想知道如何获取一个 8 位变量,
并将其分解为 8 个布尔值,用于 'for' 循环。
例如:
void byteWrite(byte byteIn)
{
for(int i=0; i<8; i++)
{
PORTA |= 128; // STHP ON
if(?)
PORTB |= 4; //STCP ON
else
PORTB &=11;// STCP OFF
_delay_ms(1);
PORTA &= 63; // STHP OFF
_delay_ms(1);
}
PORTB |= 2; // DS ON
_delay_ms(1);
PORTB &= 1; // DS OFF
}
谢谢。
使用按位与,带移位:
if((byteIn & (1 << i)) != 0)
这只是为循环中的每个步骤计算位掩码 (1 << i)
,并使用按位与(&
运算符)检查是否设置了 byteIn
中的相应位.
这是一件很常见的事情。
如果您担心在每次迭代时重新计算掩码,您可以使用常量掩码 1
(即只检查最右边的位),而不是在每次迭代时移位 byteIn
:
if((byteIn & 1) != 0)
...
else
...
byteIn >>= 1;
最后一行向右移动 byteIn
一位,以便在下一次迭代中检查下一位。这个 可以 更快,因为它的机器代码更简单(特别是对于较小的处理器,这看起来像 PIC 代码)。
请注意,上面的两个解决方案首先从最低位(最右边)开始迭代,如果这不合适,您当然需要将其反转。
for(uint8_t mask = 1<<7; mask!=0; mask>>=1)
{
if(data & mask)
{
PORT |= mask;
}
else
{
PORT &= ~mask;
}
}
我想知道如何获取一个 8 位变量, 并将其分解为 8 个布尔值,用于 'for' 循环。 例如:
void byteWrite(byte byteIn)
{
for(int i=0; i<8; i++)
{
PORTA |= 128; // STHP ON
if(?)
PORTB |= 4; //STCP ON
else
PORTB &=11;// STCP OFF
_delay_ms(1);
PORTA &= 63; // STHP OFF
_delay_ms(1);
}
PORTB |= 2; // DS ON
_delay_ms(1);
PORTB &= 1; // DS OFF
}
谢谢。
使用按位与,带移位:
if((byteIn & (1 << i)) != 0)
这只是为循环中的每个步骤计算位掩码 (1 << i)
,并使用按位与(&
运算符)检查是否设置了 byteIn
中的相应位.
这是一件很常见的事情。
如果您担心在每次迭代时重新计算掩码,您可以使用常量掩码 1
(即只检查最右边的位),而不是在每次迭代时移位 byteIn
:
if((byteIn & 1) != 0)
...
else
...
byteIn >>= 1;
最后一行向右移动 byteIn
一位,以便在下一次迭代中检查下一位。这个 可以 更快,因为它的机器代码更简单(特别是对于较小的处理器,这看起来像 PIC 代码)。
请注意,上面的两个解决方案首先从最低位(最右边)开始迭代,如果这不合适,您当然需要将其反转。
for(uint8_t mask = 1<<7; mask!=0; mask>>=1)
{
if(data & mask)
{
PORT |= mask;
}
else
{
PORT &= ~mask;
}
}