使用C将位检查的If子句替换为位操作

使用C将位检查的If子句替换为位操作,c,embedded,stm32,stm32f4discovery,C,Embedded,Stm32,Stm32f4discovery,我有以下代码块: // **** CONTROL REGISTER 4 SETUP **** ctrl|=(uint8_t)(LIS3DSH_InitStruct->CR4_Odr); if(LIS3DSH_InitStruct->CR4_Bdu) ctrl|=(1<<LIS3DSH_CR4_BDU_POSITION); if(LIS3DSH_InitStruct->CR4_Zen) ctrl|=(1<&

我有以下代码块:

// **** CONTROL REGISTER 4 SETUP ****
    ctrl|=(uint8_t)(LIS3DSH_InitStruct->CR4_Odr);
    if(LIS3DSH_InitStruct->CR4_Bdu)
        ctrl|=(1<<LIS3DSH_CR4_BDU_POSITION);
    if(LIS3DSH_InitStruct->CR4_Zen)
        ctrl|=(1<<LIS3DSH_CR4_Z_AXIS_POSITION);
    if(LIS3DSH_InitStruct->CR4_Yen)
        ctrl|=(1<<LIS3DSH_CR4_Y_AXIS_POSITION);
    if(LIS3DSH_InitStruct->CR4_Xen)
        ctrl|=(1<<LIS3DSH_CR4_X_AXIS_POSITION);
    LIS3DSH_Write(&ctrl,
                  LIS3DSH_CTRL_REG4_ADDR,
                  sizeof(ctrl));
    delay(1000000);
// **** END OF CONTROL REGISTER 4 SETUP ****
ctrl是uin8类型,我使用带有C和STM32F4发现板的IAR嵌入式工作台。以下是初始化LIS3DSH_IniStruct一部分的代码:

deviceLIS3DSH.CR4_Odr=LIS3DSH_CR4_ODR_1600HZ;
deviceLIS3DSH.CR4_Bdu=LIS3DSH_CR4_BDU_ENABLED;
deviceLIS3DSH.CR4_Zen=LIS3DSH_CR4_Z_AXIS_ENABLED;
deviceLIS3DSH.CR4_Yen=LIS3DSH_CR4_Y_AXIS_ENABLED;
deviceLIS3DSH.CR4_Xen=LIS3DSH_CR4_X_AXIS_ENABLED;
deviceLIS3DSH声明为:

LIS3DSH_InitTypeDef deviceLIS3DSH;

这些已经是位操作了

if(LIS3DSH_InitStruct->CR4_Bdu)
这将测试内部的整数是否为0。测试是一个逻辑运算符,因此它检查所有位。在内部,它可能是一条
tst
汇编指令

    ctrl|=(1<<LIS3DSH_CR4_BDU_POSITION);

ctrl |=(1这些已经是位操作了

if(LIS3DSH_InitStruct->CR4_Bdu)
这将测试内部的整数是否为0。该测试是一个逻辑运算符,因此它会检查所有位。在内部,它可能是一条
tst
汇编指令

    ctrl|=(1<<LIS3DSH_CR4_BDU_POSITION);

ctrl |=(1相同的代码,但用纯位操作替换了if语句:

// **** CONTROL REGISTER 4 SETUP ****
    ctrl |= (LIS3DSH_InitStruct->CR4_Odr);
    ctrl |= (LIS3DSH_InitStruct->CR4_Bdu << LIS3DSH_CR4_BDU_POSITION);
    ctrl |= (LIS3DSH_InitStruct->CR4_Zen << LIS3DSH_CR4_Z_AXIS_POSITION);
    ctrl |= (LIS3DSH_InitStruct->CR4_Yen << LIS3DSH_CR4_Y_AXIS_POSITION);
    ctrl |= (LIS3DSH_InitStruct->CR4_Xen << LIS3DSH_CR4_X_AXIS_POSITION);
    LIS3DSH_Write(&ctrl,
                  LIS3DSH_CTRL_REG4_ADDR,
                  sizeof(ctrl));
    delay(1000000);
// **** END OF CONTROL REGISTER 4 SETUP ****
//****控制寄存器4设置****
ctrl |=(LIS3DSH_InitStruct->CR4_Odr);

ctrl |=(LIS3DSH_InitStruct->CR4_Bdu CR4_Zen CR4_Yen CR4_Xen相同的代码,但用纯位操作替换了if语句:

// **** CONTROL REGISTER 4 SETUP ****
    ctrl |= (LIS3DSH_InitStruct->CR4_Odr);
    ctrl |= (LIS3DSH_InitStruct->CR4_Bdu << LIS3DSH_CR4_BDU_POSITION);
    ctrl |= (LIS3DSH_InitStruct->CR4_Zen << LIS3DSH_CR4_Z_AXIS_POSITION);
    ctrl |= (LIS3DSH_InitStruct->CR4_Yen << LIS3DSH_CR4_Y_AXIS_POSITION);
    ctrl |= (LIS3DSH_InitStruct->CR4_Xen << LIS3DSH_CR4_X_AXIS_POSITION);
    LIS3DSH_Write(&ctrl,
                  LIS3DSH_CTRL_REG4_ADDR,
                  sizeof(ctrl));
    delay(1000000);
// **** END OF CONTROL REGISTER 4 SETUP ****
//****控制寄存器4设置****
ctrl |=(LIS3DSH_InitStruct->CR4_Odr);

ctrl |=(LIS3DSH_InitStruct->CR4_Bdu CR4_Zen CR4_Yen CR4_Xen您能显示
ctrl
声明和
LIS3DSH_InitStruct
的类型吗?我在跟踪这个加速计(LIS3DSH)数据表,然后编码头文件。我添加了头和ctrl变量说明。从上面我可以看到,像
LIS3DSH_InitStruct->CR4_Bdu
这样的变量都是为零或非零进行测试的。如果你想不进行测试,你需要知道它们的值是什么。为什么不打印这些值来看看里面有什么?你可以吗w
ctrl
声明和
LIS3DSH\u InitStruct
的类型?我在跟踪这个加速计(LIS3DSH)数据表,然后编码头文件。我添加了头和ctrl变量说明。从上面我可以看到,像
LIS3DSH_InitStruct->CR4_Bdu
这样的变量都是为零或非零测试的。如果你不想做测试,你需要知道它们有什么值。为什么不打印这些值来查看里面有什么?好的,但是她会告诉你e是一个问题:比方说,我想配置启用X、Y、Z轴和输出数据速率(ODR)的加速计设置为100 Hz。如果我像上一篇文章中那样设置:deviceLIS3DSH.CR4_Odr=LIS3DSH\u CR4_Odr\u 1600HZ;deviceLIS3DSH.CR4_Bdu=LIS3DSH\u CR4_Bdu启用;deviceLIS3DSH.CR4_Zen=LIS3DSH\u CR4_Z_AXIS启用;deviceLIS3DSH.CR4_Yen=LIS3DSH\u CR4_Y_Y_轴启用;deviceLIS3DSH.CR4_Xen=lish\u X轴启用;然后应启用ctrl的值(摘自申请须知),但此代码为这些设置提供了ctrl值0xe6,这是错误的。为什么?代码提供的值应该是0xf9,假设它最初设置为0x00。我已经解决了这个问题,ODR值必须移到msb,然后所有其他位都通过标准位管理技术进行设置!非常感谢!好的,但这里有一个问题:比方说,我想在启用X、Y、Z轴和输出数据速率(ODR)的情况下配置加速计设置为100 Hz。如果我像上一篇文章中那样设置:deviceLIS3DSH.CR4_Odr=LIS3DSH\u CR4_Odr\u 1600HZ;deviceLIS3DSH.CR4_Bdu=LIS3DSH\u CR4_Bdu启用;deviceLIS3DSH.CR4_Zen=LIS3DSH\u CR4_Z_AXIS启用;deviceLIS3DSH.CR4_Yen=LIS3DSH\u CR4_Y_Y_轴启用;deviceLIS3DSH.CR4_Xen=lish\u X轴启用;然后应启用ctrl的值(摘自申请须知),但这段代码为这些设置提供了ctrl值0xe6,这是错误的。为什么?代码提供的值应该是0xf9,假设它最初设置为0x00。我已经解决了这个问题,ODR值必须转移到msb,然后所有其他位都通过标准位管理技术进行设置!非常感谢大家!非常感谢大家的帮助arification,但如何将多位值设置为高位4位?ODR值必须设置为MSB位置,然后才能正常工作!非常感谢您的澄清,但如何将多位值设置为高位4位?ODR值必须设置为MSB位置,然后才能正常工作!