在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)); } 

无需按位移位操作。

您可能必须整理或更改代码以使用您正在使用的特定变量集,但通常它应该可以正常工作。