将小端的位转换并屏蔽为大端

时间:2018-05-30 15:03:41

标签: c++ qt bit-manipulation endianness

我正在研究Qt / C ++应用程序。我想显示3个霍尔传感器的状态,所以我用这种方式从微控制器读取它:

uint8_t state = getState(whichMotor);
int numChars = sprintf(sBuff, "%d", state);
HAL_UART_Transmit_DMA(&huart3, sBuff, numChars);

州可以是任何1,5,4,6,2或3。

然后在我的Qt应用程序中,我有3个标签,并想显示我从UART收到的号码中是否设置了相应的位。我确信我得到了正确的数字,当我把它显示为整数时它很好。但是要把它分成三个标签分成三个标签,我失败了,因为它只显示1 1 1或0 0 0。

这是我在PC上的代码:

const void MotorWidget::setHallState(const QString& s)
{
 int hallState = s.toInt();
 ui->lbValueHallC->setText(hallState & 0b100 > 0 ? "1" : "0");
 ui->lbValueHallB->setText(hallState & 0b010 > 0 ? "1" : "0");
 ui->lbValueHallA->setText(hallState & 0b001 > 0 ? "1" : "0");
}

例如,如果我收到hallState为5,则标签C应显示" 1",标签B应显示" 0"和标签A应该显示" 1" ...但正如我所说,不管我收到什么,我只得到111或000。

我怀疑这可能是big-endian little-endian的事情......但我不知道如何修复它

2 个答案:

答案 0 :(得分:2)

也许添加一些括号:

const void MotorWidget::setHallState(const QString& s)
{
 int hallState = s.toInt();
 ui->lbValueHallC->setText((hallState & 0b100) > 0 ? "1" : "0");
 ui->lbValueHallB->setText((hallState & 0b010) > 0 ? "1" : "0");
 ui->lbValueHallA->setText((hallState & 0b001) > 0 ? "1" : "0");
}

另请看这里: http://en.cppreference.com/w/cpp/language/operator_precedence

答案 1 :(得分:0)

如果您可以建议您使用Boost C++个库:在this link中,您可以找到所需的一切。

如果您使用 GCC ,则可以使用int32_t __builtin_bswap32 (int32_t x)

替代方案,您可以自己编写函数......在this post

,这很容易