1

我正在尝试调试一些位移操作,并且我需要在位移操作之前和之后可视化这些位。

我从这个答案中读到我可能需要处理移位的回填,但我不确定这意味着什么。

我认为通过问这个问题(我如何打印 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");
        }
    }
4

2 回答 2

11
Convert.ToString(56,2).PadLeft(8,'0') returns "00111000"

这是一个字节,也适用于 int,只需增加数字

于 2014-08-07T20:17:34.423 回答
9

要测试是否设置了最后一位,您可以使用:

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++;
}
于 2013-03-09T20:39:30.597 回答