Во-первых, я бы отбросил 31u - ...
из всех выражений: все, что он делает, это переупорядочивает биты в вашем частном представлении набора битов, так что вы можете перевернуть этот порядок, чтобы никто не заметил.
Во-вторых, вы можете избавиться от ветви, используя умный бит взломать :
void SetBit(uint32* data, const uint32 bitpos, const bool f)
{
uint32 &w = data[bitpos >> 5u];
uint32 m = 1u << (bitpos & 31u);
w = (w & ~m) | (-f & m);
}
В-третьих, вы можете упростить ваш метод получения, разрешив компилятору выполнить преобразование:
bool GetBit(const uint32* data, const uint32 bitpos)
{
return data[bitpos >> 5u] & (1u << (bitpos & 31u));
}