检查是否设置了一点

如何检查一个字节中的某个位是否被设置?

bool IsBitSet(Byte b,byte nPos) { return .....; } 

听起来有点像家庭作业,但是:

 bool IsBitSet(byte b, int pos) { return (b & (1 << pos)) != 0; } 

pos 0是最不重要的位,pos 7是最多的。

基于Mario Fernandez的回答 ,我想为什么不把它放在我的工具箱中作为一个方便的扩展方法,不仅限于数据types,所以我希望可以在这里分享它:

 /// <summary> /// Returns whether the bit at the specified position is set. /// </summary> /// <typeparam name="T">Any integer type.</typeparam> /// <param name="t">The value to check.</param> /// <param name="pos"> /// The position of the bit to check, 0 refers to the least significant bit. /// </param> /// <returns>true if the specified bit is on, otherwise false.</returns> public static bool IsBitSet<T>(this T t, int pos) where T : struct, IConvertible { var value = t.ToInt64(CultureInfo.CurrentCulture); return (value & (1 << pos)) != 0; } 

这是用文字解决的。

将初始值为1的整数左移n次,然后对原始字节进行AND运算。 如果结果不为零,那么位置1否则不是。 🙂

这也适用(在.NET 4中testing):

 void Main() { //0x05 = 101b Console.WriteLine(IsBitSet(0x05, 0)); //True Console.WriteLine(IsBitSet(0x05, 1)); //False Console.WriteLine(IsBitSet(0x05, 2)); //True } bool IsBitSet(byte b, byte nPos){ return new BitArray(new[]{b})[nPos]; } 

右移inputn位,并用1屏蔽,然后testing你是否有0或1。

 x == (x | Math.Pow(2, y)); int x = 5; x == (x | Math.Pow(2, 0) //Bit 0 is ON; x == (x | Math.Pow(2, 1) //Bit 1 is OFF; x == (x | Math.Pow(2, 2) //Bit 2 is ON; 

就像是

 return ((0x1 << nPos) & b) != 0 

要检查16位字中的位:

  Int16 WordVal = 16; for (int i = 0; i < 15; i++) { bitVal = (short) ((WordVal >> i) & 0x1); sL = String.Format("Bit #{0:d} = {1:d}", i, bitVal); Console.WriteLine(sL); }