C#如何从32位int中删除前导0

时间:2014-02-05 17:34:41

标签: c# binary int trim 32-bit

我在观看twit.tv节目编码101(第2集)时遇到了这个问题。代码是预先编写的,但我们被要求更改它以打印出将整数转换为二进制数的while循环的所有值。

我能用一个简单的“Console.WriteLine(number);”打印出所有内容。线。执行此操作时,它将返回包含的32位int 0的所有值。

我的问题是,有没有办法修剪或删除循环除法中的所有额外0(不是最终的二进制数),所以它们不打印?这是该程序的代码:

public static string ConvertIntToBinary(int number)
{
    int bits = (sizeof(int) * 16); //32bits
    char[] result = new char[bits]; //Array to hold the binary numbers http://msdn.microsoft.com/en-us/library/aa288453(v=vs.71).aspx

    while (bits > 0)
    {
        bits = bits - 1;
        int remainder = number % 2; //% called mod or modulo which computes the remainder after dividing http://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx

        if (remainder == 1) //If remainder is 1, store it as 1
            result[bits] = '1';
        else
            result[bits] = '0'; //Otherwise store it as 0

        number = number / 2; //Take the original number, divide it by 2
        Console.WriteLine(number);
    }
    return new string(result).TrimStart('0'); //return the result as a string ,removing extra 0's
}

2 个答案:

答案 0 :(得分:0)

number到达0时终止循环。此时,不会有更多的非零位:

public static string ConvertIntToBinary(uint value)
{
    int totalbits = sizeof(int) * 8;
    char[] result = new char[totalbits];
    int bits = totalbits;
    uint number = value;

    while (bits > 0)
    {
        bits--;
        uint remainder = number % 2;
        result[bits] = remainder == 0 ? '0' : '1';
        number /= 2;
        if (number == 0)
            break;
    }
    return new string(result, bits, totalbits - bits);
}

我修复了代码中的错误:一个字节中有8位,而不是代码中的16位。我还简化了代码的一些部分。我使用了一个比if更简洁的条件表达式。我引入了另一个局部变量来保存工作值,以避免修改实际参数。这通常是很好的做法,使调试更容易。我还使用uint作为输入参数,因为整个方法取决于正值。

请注意,终止位于循环内部而不是while测试中。如果您在while条件中测试number等于0,那么您最终将返回空字符串以输入0

答案 1 :(得分:0)

循环时忽略所有的零位,直到你达到'1'位。

这也适用于负数。

    public static string ConvertIntToBinary(int number)
    {
        if (number == 0) return "0";
        var bits = (sizeof(int) * 8); // 8bits per byte
        var sb = new StringBuilder();
        var print = false;
        var mask = (uint)(1 << bits - 1);
        while (bits-->0)
        {
            var bit = (number & mask) == mask;
            if (bit) print = true;
            if (print) sb.Append(bit ? '1' : '0');
            mask = mask >> 1;
        }
        return sb.ToString();
    }