| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11146 人关注过本帖
标题:求教,将一个64位的二进制数如何转换为一个十进制的数
只看楼主 加入收藏
星火gavin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:78
专家分:170
注 册:2011-11-5
结帖率:90.48%
收藏
已结贴  问题点数:50 回复次数:10 
求教,将一个64位的二进制数如何转换为一个十进制的数
最大的十进制数快二十位了,该怎样处理呀?
搜索更多相关主题的帖子: 最大的 二进制 十进制 如何 
2012-06-24 22:48
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:7 
其实我一直很纳闷这个问题。数就是数,要说转换只是在显示形式上转换而已。与运算无关。

64位,用long long型接收就好了格式串是"%lld"或"%I64d"。

如果输入的就是一串01,那可以用字符串接收,之后移位拼一个long long数出来。

重剑无锋,大巧不工
2012-06-24 23:00
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:7 
转换成十六进制的怎么样?楼主应该是觉得输出的位数太多了吧
2012-06-24 23:01
星112
Rank: 5Rank: 5
来 自:山西朔州
等 级:职业侠客
威 望:2
帖 子:94
专家分:342
注 册:2012-6-22
收藏
得分:7 
你是需要用代码了还是直接想了解这个转化过程啊,对于这个转化过程,我觉得先变成16进制的,在变为十进制的可能会简单点
2012-06-24 23:10
星火gavin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:78
专家分:170
注 册:2011-11-5
收藏
得分:0 
回复 2楼 beyondyf
额,不太明白。
2012-06-24 23:20
星火gavin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:78
专家分:170
注 册:2011-11-5
收藏
得分:0 
回复 3楼 小赵q1
十六进制确实可以,不过如楼上版主所说long long 是可以的,关键是初次接触数多的,有点蒙。
2012-06-24 23:24
星火gavin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:78
专家分:170
注 册:2011-11-5
收藏
得分:0 
回复 4楼 星112
方法能说的详细一点吗?
2012-06-24 23:27
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:7 
程序代码:
#include <stdio.h>
#include <string.h>

typedef unsigned long long ull;

static ull map[64] = {
    1, 2llu, 4llu, 8llu, 16llu, 32llu, 64llu, 128llu, 256llu, 512llu, 1024llu, 2048llu, 4096llu,
    8192llu, 16384llu, 32768llu, 65536llu, 131072llu, 262144llu, 524288llu, 1048576llu,
    2097152llu, 4194304llu, 8388608llu, 16777216llu, 33554432llu, 67108864llu,
    134217728llu, 268435456llu, 536870912llu, 1073741824llu, 2147483648llu,
    4294967296llu, 8589934592llu, 17179869184llu, 34359738368llu, 68719476736llu,
    137438953472llu, 274877906944llu, 549755813888llu, 1099511627776llu,
    2199023255552llu, 4398046511104llu, 8796093022208llu, 17592186044416llu,
    35184372088832llu, 70368744177664llu, 140737488355328llu, 281474976710656llu,
     562949953421312llu, 1125899906842624llu, 2251799813685248llu,
    4503599627370496llu, 9007199254740992llu, 18014398509481984llu,
    36028797018963968llu, 72057594037927936llu, 144115188075855872llu,
    288230376151711744llu, 576460752303423488llu, 1152921504606846976llu,
    2305843009213693952llu, 4611686018427387904llu, 9223372036854775808llu
};

int main(void)
{
    ull decimal = 0;
    int i, j;
    char binary[65];
    j = strlen(gets(binary));
    for (i = 0; j--; ++i)
        decimal += (binary[j] - '0') ? map[i] : 0;
    printf("%llu\n", decimal);
    return 0;
}

My life is brilliant
2012-06-25 09:26
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:15 
回复 7楼 星火gavin
关于二进制数、十六进制数和十进制数的相互转换方法如下,这是我做的笔记中的一部分,通俗易懂,你可以看看。
一、各进制的转换
1、二进制和十六进制数
一个字节等于8个二进制位
在计算机里面,通常用一个数字后面跟一个英文字母来表示这个数的数字。
十进制用字母D、二进制用字母B、八进制用字母O和十六进制用字母H来表示。
如:10111010B、115D、0075H等,后面的字母表示这个数字是多少进制的。
2、十六进制数及其与二进制、十进制数之间的转换
(1)十进制数转换为二进制数和十六进制数的方法:
用除以2取余法和除以16取余法:
例如:N=45D转换为二进制数:
整除式子       余数
45/2=22        a0=1  
22/2=11        a1=0    
11/2=5         a2=1    
5/2=2          a3=1    
2/2=1          a4=0    
1/2=0          a5=1  
因为算结果的时候是从下向上算的,所以:N=45D=101101B。
例如:N=117D转换为十六进制数:
整除式子       余数
117/16=7       a0=5  
7/16=0         a1=7  
计算结果仍然是从下向上:所以:N=117D=75H。
注意:1/2=0余1,可以看成是2*0+1=1,7/16=0同理。

(2)二进制数或十六进制数转换为十进制数的方法:
各位二进制数码乘以与其对应的权之和
或各位十六进制数码乘以与其对应的权之和
也就是权的展开式。
例如:将二进制数1011100101B转换为十进制数:
1    0    1    1    1    0    0    1    0    1
先判断这个二进制码有多少位再减一,这里是10位减一后是9。
然后用各位二进制数码乘以与其对应的权之和:
第十位的二进制数码是1,与其对应的权是2的10-1次方1*2^9,
第九位的二进制数码是0,与其对应的权是2的9-1次方0*2^8,
以此类推,因为是二进制数,所以对应的权就是2的这个二进制码对应的位数减一次方。


  1       0       1       1       1       0       0       1       0       1
1*2^9 + 0*2^8 + 1*2^7 + 1*2^6 + 1*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 权的展开式
=1*512 +  0   + 1*128 + 1*64 + 1*32  +  0  +   0   + 1*4  +  0   + 1*1 = 741D
以上方法得出二进制数1011100101B的十进制数为741D。
十六进制转换为十进制的方法:
方法同二进制转换为十进制相似,只不过权变成了16的这个十六进制码对应的位数减一次方。
例如:将3A4H转换为十进制:
    3        A        4
=3*16^2 + A*16^1 + 4*16^0    权的展开式
A在十六进制中表示的是10,所以上式应该变为:
=3*16^2 + 10*16^1 + 4*16^0
=3*256  + 10*16  + 4*1
=768    +  160  +4  = 932D
注意:任何数的0次方都等于1;
(3)十六进制数和二进制数之间的相互转换:
一个二进制数,把它的低位到高位每4位组成一组,直接用十六进制数来表示
例如:把二进制数1011100101转换为十六进制数;
10   1110    0101
最前面不够4位的用0补齐,上式变为
0010    1110    0101
然后用8421法,因为2的三次方是8,所以第四位的二进制码乘以8,因为2的二次方是2,所以第三位就是二进制码乘以4,因为2的一次方是2,所以第二位就是二进制码乘以2,因为2的零次方为1,所以第一位就是二进制码乘以1。
上式的值就是:
0010    1110    0101
 2      8+4+2   4+1
 2       14     5
14在十六进制中用E表示,所以1011100101B = 2E5H。
将十六进制数转换为二进制数,只需将十六进制数的每一位用4位二进制数表示就形成了相应的二进制数。
例如:把十六进制数A19C转换成相应的二进制数
 A      1     9     C
=10     1     9    12
=8+2    1    8+1   8+4
=1010  0001  1001  1100
所以:A19CH=1010000110011100B。


[ 本帖最后由 小赵q1 于 2012-6-25 21:43 编辑 ]
2012-06-25 21:28
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:7 
以下是引用beyondyf在2012-6-24 23:00:42的发言:

其实我一直很纳闷这个问题。数就是数,要说转换只是在显示形式上转换而已。与运算无关。

64位,用long long型接收就好了格式串是"%lld"或"%I64d"。

如果输入的就是一串01,那可以用字符串接收,之后移位拼一个long long数出来。
版主说的对 数就是数 进制只不过是表示方法不同

就好像 你可以把2这个十进制数写在纸上 是个2 也可以伸两根手指头表示 自然也可以用2进制的10来表示
2012-06-25 21:34
快速回复:求教,将一个64位的二进制数如何转换为一个十进制的数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044507 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved