一般情况
C#里自带的Convert.ToString(number,2)能满足多数时候的需求。number=3时,得到字符串“11”。
怎样得到特定长度的二进制字符串?我们需要把左边的空位填充起来,正数填充0,那么如果要得到长度为8的二进制字符串,可以用PadLeft(len,'0'),len取8
负数
PadLeft(len)的问题是,不会删去大于len长度的高位,只会在长度小于len时填充空位。所以此处得到的字符串长度32,对应Int32的长度。
如果将-2强制转化成其他类型,比如short,字符串长度会相应改变。这样可以得到特定长度的字符串,但还不够灵活,比如不能得到7位的二进制字符串,因为这不属于C#的基本类型。
我们想到位运算。比如,a&0xFF是取a的低8位,a&0xFFFF是取a的低16位。a&(2^n-1)是取a的低n位,因为2^n-1就是n位都为1的二进制数。
试一下
需要得到n长度的二进制字符串,只需要把0xFF替换为(Math.Pow(2,n)-1), 8替换为n。
字符串长度过大
C#自带正数类型长度最大为64位的Int64,长度在64位以内的,前面的方法足够了。如果长度在64以上,有几种思路。就用我们在小学二年级学的辗转相除法吧!
先把原数值a存储为decimal类型,因为decimal可以存储非常大的数值(10的28次方)。然后对a除以二取余,余数保存,继续对商除二取余,余数保存到数组......直到商等于0。把保存下来的余数按得到的顺序逆序输出。写成代码就是这样:
//Microsoft (R) Visual C# Compiler version 3.4.0-beta4-19562-05 (ff930dec)
//Copyright (C) Microsoft Corporation. All rights reserved.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
decimal bignumber = 100000000000000000000000000m;//10^26
//Your code goes here
List<int> list = new List<int>();
while(bignumber>=1){
int x = bignumber%2==0?0:1;
list.Add(x);
bignumber /=2;
}
for(int i=list.Count-1;i>=0;i--)
{
Console.Write(list[i]);
}
}
}
}
跑一下