2 to 8:以10010为例,要转成8进制,则从右向左看,每3个为一组,不足的补零,变成010 010,加上权值后为22,即为8进制数!
2 to 16: 以101110为例,要转成16进制,类似,从右向左看,每4个为一组,不足的补零,变成0010 1110,加上权值后为2E,有个规律,8进制的各个位<=7,16进制的各个位<=15,也就是说16进制中的数可以是1、2、3、4……9、A、B、C、D、E、F。
8 to 16:以27为例,8进制和16进制之间的转换需要用2进制来作为过渡,先转成2进制为010 111,然后从右向左数,将现在的3个一组变为4个一组,不足的补零,变为0001 0111,然后权值变换后为1 7,也就是16进制数 17
其实8,16,2,进制之间的转换很好算。下面介绍10到2,8,16进制之间的转换。
同上面那样,为了快速计算,我们需要了解一些比较常用的式子。如下所示:
21=2 ; 22=4 ; 23=8 ; 24=16 ; 25=32 ; 26=64 ; 27=128 ; 28=256
10 to 2:以52为例,52-32-16-4 = 0,也就是说52可以分解为4+16+32,而32对应的是25,因而最高位是第6位为1,即32是100000(或者说后面跟5个0)。这样52可以分解为100000+10000+100=110100(2)
通过这种方式转为2进制之后就很容易再转为8、16进制。
原来的方法:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写 就是结果
例如302
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
//ACMer LittleFool #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> using namespace std; /*此方法与原来方法计较:用位运算进行代替除法运算,并减少除法进的多余的次数*/ int zhuanhuan(int a) //十进制转二进制 快速转换 { int n,i,len,pow2; char tag[1000]; memset(tag,‘0‘,sizeof(tag)); pow2=1; for(i=0;pow2<=a;i++) pow2<<=1; tag[i]=‘\0‘; len=i-1; while(a>0) { if(a>=pow2) { tag[len-i]=‘1‘; a-=pow2; } i--; pow2>>=1; } a=atoi(tag); // printf("%d\n",a); return a; } int main() { int a=2,i; for(i=0;i<29;i++) zhuanhuan(i); return 0; }
原文:http://blog.csdn.net/littlefool5201314/article/details/22927311