我在观看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
}
答案 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();
}