32位寄存器中的位设置

时间:2014-10-30 07:57:15

标签: c++ bits

我已将此功能设置为寄存器中的位:

void setBitsInRange( const uint32_t offset, const uint8_t fromBit, const uint8_t numOfBits,  uint32_t val  )
{
    uint32_t regVal = readRegister( offset );
    uint32_t mask = (( 1 << ( fromBit + numOfBits)) - ( 1 << fromBit));
    aValueToSet = val << fromBit;
    uint32_t result = ( regVal & ~mask) | ( val & mask );
    writeRegister( offset, result );
}

这适用于所有位,除非我需要更改所有32位。有没有办法使用给定的API执行此操作?

这是一个例子

writeRegister(registerOffset,0x0);
setBitsInRange(registerOffset,0,32, 0xFFFFFFFF );
CHECK_EQUAL(0xFFFFFFFF, readRegister(registerOffset));  //FAIL


writeRegister(registerOffset,0x0);
setBitsInRange(registerOffset,0,31, 0x7FFFFFFF );
CHECK_EQUAL(0x7FFFFFFF, readRegister(registerOffset));

writeRegister(registerOffset,0x0);
setBitsInRange(registerOffset,16,16,0xAAAA);
readBack = readRegister(registerOffset);
CHECK_EQUAL(0xAAAA0000, readBack);

2 个答案:

答案 0 :(得分:1)

如果它适用于除fromBit == 0 && numOfBits == 32之外的所有输入,那么这应该解决它:

uint32_t mask = (uint32_t)(((1LL << (fromBit + numOfBits)) - (1 << fromBit)))

答案 1 :(得分:0)

它实际上对任何32位移位都不起作用。 uint32_t(1) << 32刚刚未定义。

但是,由于您以后执行- 1 << (fromBit),并且未分类算术是模块化的,因此无论您执行uint32_t(1ULL << 32 - 256)还是0UL - 256UL都无关紧要。在这两种情况下,结果都是~255UL,但在后者中它只是一个32位操作。

所以你基本上需要加前缀(fromBit + numOfBits == 32) ? 0 :