使用for循环检查字节中的位

时间:2012-01-20 08:44:38

标签: c#

我最近正在学习C#,其中我遇到了以下for循环

// Display the bits within a byte.
using System;

class ShowBits { 

 static void Main() { 

  int t;
  byte val;
  val = 123; 

  for(t=128; t > 0; t = t/2) { 

     if((val & t) != 0)
         Console.Write("1 ");

     if((val & t) == 0) 
         Console.Write("0 ");

   }
 }
}

我无法理解为什么在for循环的递增/递减部分执行t = t / 2。请解释

4 个答案:

答案 0 :(得分:5)

十进制128是二进制10000000 - 即仅用于字节的最高有效位的掩码。当你将它除以2时,得到01000000,即第二最高有效位等。

在原始值和掩码之间使用&,只与0比较表示该位是否设置为原始值。

另一种选择是改变原始值:

for (int i = 7; i >= 0; i--)
{
    int shifted = val >> i;
    // Take the bottom-most bit of the shifted value
    Console.Write("{0} ", shifted & 1);
}

答案 1 :(得分:3)

t用作val中位的掩码 所以从二进制的128,10000000开始 当它除以2时,它变为64 - 或01000000 直到达到0为止。

然后在每次迭代中,'&'用于使用val中的当前位掩码t中的位。

答案 2 :(得分:3)

循环减少2的幂并在掩码中使用该值。

(基数10):128,64,32,16,8,4,2,1

(基数2):10000000,010000,00100000,00010000,00001000,00000100,00000010,00000001

答案 3 :(得分:3)

128以二进制形式写成10000000,因此我们检查一个字节中的最高位是否打开。然后我们做t = t / 2,它是t=128/2=64,它以二进制形式写成01000000,依此类推。任何一个部门都将一个地方的一位移到右边。