考虑一个C语言中的变量
现在假设我想要将这个变量的第i位设置为1。
请注意,该变量已经有了一些值。因此,
unsigned int a;
。现在假设我想要将这个变量的第i位设置为1。
请注意,该变量已经有了一些值。因此,
a=(1<<i)
将无法工作。
a=a+(1<<i)
可以工作,但是我正在寻找最快的方法。有什么办法吗?unsigned int a;
。a=(1<<i)
将无法工作。
a=a+(1<<i)
可以工作,但是我正在寻找最快的方法。有什么办法吗?对它执行按位或运算。例如:a |= (1<<i)
addl
指令所需的时钟周期不会比 orl
指令更长。 - Matt K#define BIT_MASK(bit) (1 << (bit))
#define SET_BIT(value,bit) ((value) |= BIT_MASK(bit))
#define CLEAR_BIT(value,bit) ((value) &= ~BIT_MASK(bit))
#define TEST_BIT(value,bit) (((value) & BIT_MASK(bit)) ? 1 : 0)
a |= (1 << i);
a |= 1 << i;
你可能可以使用
a |= (1 << i)
但这不会有太大的影响。就性能而言,您不应该看到任何差异。
您可以尝试构建一个表格,将 i
映射到位掩码(例如,2
=> 0x0010
对于 0000000000100
),但这有点不必要。
a |= (1 << i);
我实现位标志的方式(引用我的代码库,您可以自由地将其用于任何目的,甚至商业用途):
void SetEnableFlags(int &BitFlags, const int Flags)
{
BitFlags = (BitFlags|Flags);
}
const int EnableFlags(const int BitFlags, const int Flags)
{
return (BitFlags|Flags);
}
void SetDisableFlags(int BitFlags, const int Flags)
{
BitFlags = (BitFlags&(~Flags));
}
const int DisableFlags(const int BitFlags, const int Flags)
{
return (BitFlags&(~Flags));
}
不需要位移操作。
你可能需要整理或修改代码以使用特定的变量集,但通常它应该可以正常工作。