加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

vb.net – 如何将一个很长的二进制数转换为十进制?

发布时间:2020-12-17 07:20:14 所属栏目:百科 来源:网络整理
导读:我有一个二进制数表示为11.2222211(.类似于小数点).在该点之前有2位,在该点之后有1024位.这是一个计算e到高精度的练习,但现在我被困在如何将它转换为十进制. 万一你想知道这个数字,这里是: 10.10110222221000010101000101100010100010101110110100101010011
我有一个二进制数表示为11.2222211(.类似于小数点).在该点之前有2位,在该点之后有1024位.这是一个计算e到高精度的练习,但现在我被困在如何将它转换为十进制.
万一你想知道这个数字,这里是:

10.1011022222100001010100010110001010001010111011010010101001101010102222210111000101011000100000001001110011110100111100111100011101100010111001110001011000001111001110001011010011011010010101101010011110000100110110010000010001010001100100001100222221101111001100100100111001110111001110001001001001101100222220222220010222220100102222211000110110001101100011000011000111010111011000111101101000000110110010000000101010111011000100011000010111101011010011110222220001111011010101110101022222110101100101011000010010010000110022222101010002222201022222000001100110111011010000100001010110001101100101010101010011110111101101000110101111001110110101010101110001001101011110022222110101022222001001001101011001100001001111000011000111000011100000111001101000101101110222221000101010011010001001110110101111002222202222211010000111001000011102222200010101100010100001001101101010110111100111001101010011000010101100110010100100111101001000001110100111100101111010101111000000101010110001100000101011001100100100222220110011101011

如何将其转换为2.718 ….(小数点后应该有大约309位数)
我不能简单地将每个位乘以2 ^ x,因为经过一段时间后,数字2 ^ x将= 0,即使使用双精度浮点数也是如此.我使用的是Visual Basic,所以我不确定是否存在更大的变量.

[由Spektre编辑]

只需用我的代码运行你的字符串(根据我的评论中的链接),结果是:

e(bigdecimal)=2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170189257927265177296267786175561825444670874889747782175809270565601486538810885558129926100522647929865142359038501319247028975364903531383896590857864585070203793060262761378008328322397393650711101939331201
e      (text)=2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170189
e (reference)=2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957035035402123407849819334321068170121005627880235193033224745015853904730419957777093503660416997329725088687696640355570716226844716256079882651787134195124665201030592123667719432527867539855894489697096409754591856956380236370162112047742722836489613422516445078182442352948636372141740238893441247963574370263755294448337998016125492278509257782562092622648326277933386566481627725164019105900491644998289315056604725802778631864155195653244258698294695930801915298721172556347546396447910145904090586298496791287406870504895858671747985466775757320568128845920541334053922000113786300945560688166740016984205580403363795376452030402432256613527836951177883863874439662532249850654995886234281899707733276171783928034946501434558897071942586398772754710962953741521115136835062752602326484728703920764310059584116612054529703023647254929666938115137322753645098889031360205724817658511806303644281231496550704751025446501172721155519486685080036853228183152196003735625279449515828418829478761085263981395599006737648292244375287184624578036192981971399147564488262603903381441823262515097482798777996437308997038886778227138360577297882412561190717663946507063304527954661855096666185664709711344474016070462621568071748187784437143698821855967095910259686200235371858874856965220005031173439207321139080329363447972735595527734907178379342163701205005451326383544000186323991490705479778056697853358048966906295119432473099587655236812859041383241160722602998330535370876138939639177957454016137223618789365260538155841587186925538606164779834025435128

第一个是从文本转换为我的arbnum数据类型,然后转换回文本,中间是纯文本到文本转换(比如之前转换为十六进制的链接),最后是reference e

这里是二进制字符串的十六进制字符串:

e (hex)      =2.B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF324E7738926CFBE5F4BF8D8D8C31D763DA06C80ABB1185EB4F7C7B5757F5958490CFD47D7C19BB42158D9554F7B46BCED55C4D79FD5F24D6613C31C3839A2DDF8A9A276BCFBFA1C877C56284DAB79CD4C2B3293D20E9E5EAF02AC60ACC93ECEBh

我截断了十进制半字节大小,所以最后可能会留下1,2或3位未经处理的…

解决方法

>将二进制字符串转换为十六进制

整数部分很容易“10”. – > “2”.小数部分也很容易:

10.1011022222100001010100010110 bin
10.1011 0111 1110 0001 0101 0001 0110 bin
 2.B    7    E    1    5    1    6    hex

正如你所看到的,每个nibel整数值也是十六进制数字0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F这里有一些C代码:

int i,j,l; char *t16="0123456789ABCDEF";
AnsiString s0="10.your binary number",s1="2.";
for (i=4,l=s0.Length();i<=l;)
    {
    j=0;
    if ((i<=l)&&(s0[i]=='1')) j+=8; i++;
    if ((i<=l)&&(s0[i]=='1')) j+=4; i++;
    if ((i<=l)&&(s0[i]=='1')) j+=2; i++;
    if ((i<=l)&&(s0[i]=='1')) j+=1; i++;
    s1+=char(t16[j]);
    } // here s1 holds the hex string

通过预先分配生成的s1大小,可以显着提高速度
>运行hex到dec字符串转换

AnsiString str_hex2dec(const AnsiString &hex)
    {
    char c;
    AnsiString dec="",s;
    int i,l,ll,cy,val;
    int  i0,i1,i2,i3,sig;
    sig=+1; l=hex.Length();
    if (l) { c=hex[l]; if (c=='h') l--; if (c=='H') l--; }
    i0=0; i1=l; i2=0; i3=l;
    for (i=1;i<=l;i++)      // scan for parts of number
        {
        char c=hex[i];
        if (c=='-') sig=-sig;
        if ((c=='.')||(c==',')) i1=i-1;
        if ((c>='0')&&(c<='9')) { if (!i0) i0=i; if ((!i2)&&(i>i1)) i2=i; }
        if ((c>='A')&&(c<='F')) { if (!i0) i0=i; if ((!i2)&&(i>i1)) i2=i; }
        if ((c>='a')&&(c<='f')) { if (!i0) i0=i; if ((!i2)&&(i>i1)) i2=i; }
        }

    l=0; s=""; if (i0) for (i=i0;i<=i1;i++)
        {
        c=hex[i];
             if ((c>='0')&&(c<='9')) c-='0';
        else if ((c>='A')&&(c<='F')) c-='A'-10;
        else if ((c>='a')&&(c<='f')) c-='A'-10;
        for (cy=c,j=1;j<=l;j++)
            {
            val=(s[j]<<4)+cy;
            s[j]=val%10;
            cy  =val/10;
            }
        while (cy>0)
            {
            l++;
            s+=char(cy%10);
            cy/=10;
            }
        }
    if (s!="")
        {
        for (j=1;j<=l;j++) { c=s[j]; if (c<10) c+='0'; else c+='A'-10; s[j]=c; }
        for (i=l,j=1;j<i;j++,i--) { c=s[i]; s[i]=s[j]; s[j]=c; }
        dec+=s;
        }
    if (dec=="") dec="0";
    if (sig<0) dec="-"+dec;

    if (i2)
        {
        dec+='.';
        s=hex.SubString(i2,i3-i2+1);
        l=s.Length();
        for (i=1;i<=l;i++)
            {
            c=s[i];
                 if ((c>='0')&&(c<='9')) c-='0';
            else if ((c>='A')&&(c<='F')) c-='A'-10;
            else if ((c>='a')&&(c<='f')) c-='A'-10;
            s[i]=c;
            }
        ll=((l*1234)>>10);  // num of decimals to compute
        for (cy=0,i=1;i<=ll;i++)
            {
            for (cy=0,j=l;j>=1;j--)
                {
                val=s[j];
                val*=10;
                val+=cy;
                s[j]=val&15;
                cy=val>>4;
                }
            dec+=char(cy+'0');
            for (;;)
                {
                if (!l) break;;
                if (s[l]) break;
                l--;
                }
            if (!l) break;;
            }
        }

    return dec;
    }

此C / VCL代码基于dec to/from hex string conversion in C++

这里有一些完整的结果(没有截断):

e (number)=2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517018925792726517729626778617556182544467087488974778217580927056560148653881088555812992610052264792986514235903850131924702897536490353138389659085786458507020379306026276137800832832239739365071110193933120100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
e (text)  =2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551701892
e (const) =2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957035035402123407849819334321068170121005627880235193033224745015853904730419957777093503660416997329725088687696640355570716226844716256079882651787134195124665201030592123667719432527867539855894489697096409754591856956380236370162112047742722836489613422516445078182442352948636372141740238893441247963574370263755294448337998016125492278509257782562092622648326277933386566481627725164019105900491644998289315056604725802778631864155195653244258698294695930801915298721172556347546396447910145904090586298496791287406870504895858671747985466775757320568128845920541334053922000113786300945560688166740016984205580403363795376452030402432256613527836951177883863874439662532249850654995886234281899707733276171783928034946501434558897071942586398772754710962953741521115136835062752602326484728703920764310059584116612054529703023647254929666938115137322753645098889031360205724817658511806303644281231496550704751025446501172721155519486685080036853228183152196003735625279449515828418829478761085263981395599006737648292244375287184624578036192981971399147564488262603903381441823262515097482798777996437308997038886778227138360577297882412561190717663946507063304527954661855096666185664709711344474016070462621568071748187784437143698821855967095910259686200235371858874856965220005031173439207321139080329363447972735595527734907178379342163701205005451326383544000186323991490705479778056697853358048966906295119432473099587655236812859041383241160722602998330535370876138939639177957454016137223618789365260538155841587186925538606164779834025435128
e (hex)   =2.B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF324E7738926CFBE5F4BF8D8D8C31D763DA06C80ABB1185EB4F7C7B5757F5958490CFD47D7C19BB42158D9554F7B46BCED55C4D79FD5F24D6613C31C3839A2DDF8A9A276BCFBFA1C877C56284DAB79CD4C2B3293D20E9E5EAF02AC60ACC93ECEBh

AnsiString只是VCL字符串类,具有自动重新分配功能,因此您只需通过,=运算符即可添加字符串…

[Edit1] hex2dec字符串转换的描述

好的,我们有十六进制格式的十六进制字符串,并且想要计算十进制格式的十进制格式的十进制数.

>扫描数字部分

这只是用单个O(n)循环扫描十六进制字符串并记住特殊字符的位置:

> i0第一个整数位
> i1最后一个整数位(小数点前)
> i2第一个小数位(小数点后)
> i3最后一个小数位
> sig从开始设置为1,如果 – 检测到 – 则设置为-1表示数字符号

所以我们可以使用后者来简化数字提取.
>转换整数部分

整数部分是通过将十六进制数值相加来计算的,例如:

> 51Ah = 500h 10h Ah = 5 * 16 ^ 2 1 * 16 ^ 1 10 * 16 ^ 0 = 1306

这通常是这样重写的:

> 51Ah =(((5)* 16 1)* 16 10)= 1306

您可以这样想,就像您在源BASE(10)算术中将目标数乘以BASE(16)一样.

所以你先从最重要的数字开始阅读.将其值添加到数字.如果没有其他整数位,则停止,否则将十进制字符串乘以16并读取/添加下一个数字.这就是第二个for循环.

> if(i0)for(i = i0; i< = i1; i)如果存在整数部分则通过其所有数字
> c设置为已处理数字的十进制值< 0,F> hex – > < 0.15>癸

嵌套的(cy = c,j = 1; j <= 1; j)只是将整数十进制串s乘以16.在开始时s =“”;升= 0;其中s是十进制结果字符串,但是以反向数字顺序而不是用ASCII编码而是数字值直接存在{0,... 9}而不是{“0”,“1”,... }和l是s内的位数. VCL字符串从1开始索引,这就是为什么从1开始而不是0.那么如何将十进制字符串乘以16?

123*16= 100*16 +  20*16 +  3*16
      =1600    + 320    + 48

因此,再次读取数字十进制值< 0,9> (以最不重要的一个开头)进入val.将其乘以16(或向左移位4位,<< 4与* 16相同)并根据需要添加前一个数字的进位cy(从开始设置为十六进制数值,所以它也是加上......).现在结果通常超过1位数,这是携带的地方.那么将s的结果数字设置为s [j] = val?并设置进位到val / 10你可以忽略10 ^(j-1),因为当你处理s [j]时,10的幂由j位置表示,所以如果你存储回s [j]的值,那么数字已经被供电...这必须从最低有效数字开始,因为在计算时更高的数字仍然在变化. 在此之后,while(cy> 0)只是在s中添加新数字,如果结果需要额外的数字来适应.

在此之后,正常顺序(不再反转)将数字值从ASCII转换为ASCII,复制到最终的dec字符串,并在需要时添加signum.这就是整数部分.
>小数部分以if(i2)开头

通过在源BASE(16)算术中将其乘以目标BASE(10),将分数转换为另一个BASE.因此,在hexa算术中乘以10 = Ah …

------------
    0.B7Eh -> B7Eh
    ------------
    B7Eh * Ah = 7 2ECh
    2ECh * Ah = 1 D38h
    D38h * Ah = 8 430h
    430h * Ah = 2 9E0h
    -------------
    0.B7Eh -> 0.7182 dec
    ------------

如果存在小数部分,则添加到最终的十进制字符串小数点.并且将所有小数十六进制数字提取为s字符串(首先是最高有效数字)从ASCII转换为十六进制数字值< 0,15>并将l设置为小数位数.然后计算ll,这是由十六进制小数位表示的十进制小数位数ll = l * 1234/1024正如您在示例中所看到的,您有时可以循环转换无限生成新的小数位,因此ll tels何时停止…

转换在ll计算之后开始. for(cy = 0,i = 1; i< = ll; i)只是循环遍历所有结果数字以进行计算.在每次迭代中,s乘以10,但这次是十六进制算术.这就是为什么s [j] = val?和cy = val / 16.我使用位操作AND和位移,但结果是相同的.在乘法之后,进位包含小数位数,因此它被添加到最终结果中. 最后只是检查s中的子结果是否以零结尾,如果是,则将它们切断(通过l–),如果没有更多有效数字,则停止该过程.这大大加快了这个过程… 希望它对你来说足够了……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读