2013-03-09 44 views
1

我试图调试一些位移操作,并且我需要在位移操作之前和之后将它们可视化。如何正确循环并打印Int,Long,Float或BigInteger的位?

I read from this answer我可能需要处理移位回填,但我不确定这意味着什么。

我认为通过询问这个问题(我如何在int中打印这些数据)我可以找出回填是什么以及可能存在的其他一些问题。

这是我的示例代码。

static string GetBits(int num) 
    { 
     StringBuilder sb = new StringBuilder(); 
     uint bits = (uint)num; 
     while (bits!=0) 
     { 
      bits >>= 1; 

      isBitSet = // somehow do an | operation on the first bit. 
         // I'm unsure if it's possible to handle different data types here 
         // or if unsafe code and a PTR is needed 

      if (isBitSet) 
       sb.Append("1"); 
      else 
       sb.Append("0"); 
     } 
    } 
+0

回填这里指的是符号位(最左边位)转移逐步权利,但也维持在最左边的位置。所以最终你会得到1比特。 – siride 2013-03-09 20:40:25

回答

5

要测试的最后一位被设置,你可以使用:

isBitSet = ((bits & 1) == 1); 

但这样右移(不是之后)之前,你应该做的,否则你遗漏了第一位:

isBitSet = ((bits & 1) == 1); 
bits = bits >> 1; 

但更好的选择是使用BitConverter类的静态方法来获取用于表示内存中的数字的实际字节到字节数组中。这种方法的优点(或者取决于你的需要)是反映了运行代码的机器的字节序。

byte[] bytes = BitConverter.GetBytes(num); 

int bitPos = 0; 
while(bitPos < 8 * bytes.Length) 
{ 
    int byteIndex = bitPos/8; 
    int offset = bitPos % 8; 
    bool isSet = (bytes[byteIndex] & (1 << offset)) != 0; 

    // isSet = [True] if the bit at bitPos is set, false otherwise 

    bitPos++; 
} 
7
Convert.ToString(56,2).PadLeft(8,'0') returns "00111000" 

这是一个字节,适用于INT也只是增加了数字