在C中设置变量中特定位的最佳方法是什么
考虑一个变量unsigned int a;
在C.
现在说我想将此变量中的任何第i位设置为“1”。
请注意,变量有一些值。 所以a=(1<<i)
将不起作用。
a=a+(1<<i)
将起作用,但我正在寻找最快的方法。 什么?
按位或它。 例如a |= (1<
一些有用的位操作宏
#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);
这只是两个操作 - 移位和OR。 很难看出如何改进这一点。
您应该使用按位OR进行此操作。
a |= 1 << i;
你可以使用
a |= (1 << i)
但它不会产生太大的影响。 在性能方面,你不应该看到任何差异。
您可以尝试构建一个表格,将i
映射到位掩码(例如2
=> 0x0010
表示0000000000100
),但这有点不必要。
您可以使用按位OR:
a |= (1 << i);
请注意,这与+具有相同的行为,如果您正在设置的位中已经有1,则该行为将被携带。
我实现位标志的方式(直接引用我的代码库,你可以自由地使用它用于任何目的,甚至是商业用途):
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)); }
无需按位移位操作。
您可能必须整理或更改代码以使用您正在使用的特定变量集,但通常它应该可以正常工作。