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

本文关键字:字节 检查 for 循环 使用 | 更新日期: 2023-09-27 18:20:48

我最近在学习C#,在那里我遇到了以下循环

// 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。plz解释

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

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

它以2的幂递减循环,并在掩码中使用该值。

(基本10):128、64、32、16、8、4、2、1

(基数2):1000000001000000、00100000、00010000、00001000、00000100、00000010、0000000 1

128在二进制中被写为10000000,所以我们检查字节中的最高位是否打开。然后我们做t=t/2,这是t=128/2=64,在二进制中写入01000000,依此类推。任何除法都会将位于一个位置的一位向右移动。

t用作val中位的掩码
所以它从二进制的12810000000开始
当它除以2时,它变为64或01000000。
一直持续到0。

然后在每次迭代中用于用CCD_ 7中的当前比特来屏蔽CCD_。