【C#】数值转换为任意长度的二进制字符串

一般情况

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]);
            }
        }
    }
}

跑一下

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值