不用除法和取余做十进制到二进制十六进制的转换

原创 2015年07月07日 21:15:56

一、基本理论

1、移位:当一个数左移时,高位舍弃,低位补0;右移时,若最高位为1,则补1,否则补0。


二、十进制数转为二进制

1、思想:给定一个十进制数,我们可以通过移位来得到其对应的二进制数。

      例如:对于long类型的十进制数1024,在32位计算机上,其二进制表示为

     (00000000 | 00000000| 00000100|00000000)

      为了得到其最高位的数字(红色部分)

     (00000000 | 00000000| 00000100|00000000)

      我们可以数字1左移31位,然后与1024做“&” 操作,然后再右移31即可。

       00000000 | 00000000| 00000100|00000000

     &10000000 | 00000000| 00000100|00000000

      =00000000 | 00000000| 00000100|00000000

     右移后为00000000 | 00000000| 00000100|00000000

2、代码

char *Dec2Bin(long number)
{
	char *buf=new char[33];//long 整型有32位,加上以为结束符总共需要33位的空间
	char *temp = buf;
	long tem;//将tem定义成long类型,因为一个数与本身做"&"运算可能等于其本身。
	for (unsigned int i = 0; i < 32; i++)
	{
		tem = (number & (1 <<(31 - i)));
		tem = (tem >> (31 - i));
		temp[i] = (tem == 0) ? '0' : '1';
	}

	buf[32] = '\0';//添加字符串结束符
	return buf;
}


三、十进制转为十六进制

1、思想:每位十六进制数可以看成为4位二进制数,既然二进制数可以通过移位来完成进制转换操作,那么十六进制也是可以的,只是每次操作要将4位,二进制数作为一个整体。

    例如:对于十进制数238。首先,其二进制表示为(0000 0000|0000 0000|0000 0000|1110 1110)

             为了能够处理最高的四位数(红色部分)

             0000 0000|0000 0000|0000 0000|1110 1110

             我们可以先将原数先左移0位,然后再右移28位

             0000 0000|0000 0000|0000 0000|0000 0000

             同理,为了得到最后4位数字,可以将原数据,先左移4*7位,然后再右移28位(这里的7是指从高位到低位的第7个4位数)

             先左移28位 1110 0000|0000 0000|0000 0000|0000 0000

             后右移28位 1111 1111|1111 1111|11111 1111|1111 1110 由于最高位为1,所以右移时补1,该数的十进制表示为-2,而(1110)原本的十进制数表示为14,

             但我们发现 -2+16=14。于是猜测若得到的数小于0,就要做加16操作。

             验证   : 原16进制数                   按上述规则移动后得到的数

                                  15                                        -1

                                  14                                        -2

                                  13                                        -3

                                 ……                                     ……

                                   8                                         -8

                                   7                                          7

                                  ……                                      ……

                                   1                                          1

                                    0                                          0

             由上述规则可知,上述猜测正确,若所得数小于0则需做加16操作

             最后,为了能够将数字转换为字符,对小于10的数字直接加上48(0的ASCII码),大于等于10的数字需要加上55(64-9,64为A的ASCII码)。

2、代码

char *Dec2Hex(long num)
{
	char *buf = new char[11];//数字域八个字符,再加上十六进制的前缀2个字符,字符串结束符一个字符,总共十一个字符
	buf[0] = '0';
	buf[1] = 'x';
	buf[10] = '\0';
	char *temp = buf + 2;
	long tem;
	for (int i = 0; i < 8; i++)
	{
		tem = num << 4 * i >> 28;//"*"的优级高于">>" 
		tem = tem >= 0 ? tem : tem + 16;//
		temp[i] = tem < 10 ? tem+ '0' : tem + 55;
	}
	return buf;
}


四、十进制转换为八进制

1、思想:八进制可以每位可以看成是3位二进制数,但是对于32位数,不是3的整数倍,所以对前两位数要做单独处理。首先将原数左移两位然后再右移30位,

              即得到该两位数,其余的每3位一处理,移动规则为先左移3*i+2位,再右移29位。按照以上规则移动,会得到如下的对应规则

               原八进制数            移动后得到的数

                  7                             -1

                  6                             -2

                  5                             -3

                  4                             -4

                  3                              3

                  2                              2

                  1                              1

                  0                              0

              上述规则表明,如果移动后得到的数小于0,则要做加8操作

2、代码

char *Dec2Oct(long num)
{
	char *buf = new char[13];
	buf[0] = '0';
	buf[12] = '\0';
	long tem;
	tem = num >> 30;//对于八进制数由于不是32的整数倍,所以多出的两位要单独处理
	buf[1] = tem >=0? tem+ '0':tem+8+'0';
	char *temp = buf + 2;	
	for (int i = 0; i < 10; i++)
	{
		tem = num << 3 * i +2>> 29;
		tem = tem <=0 ? tem+8 : tem;
		temp[i] = tem + '0';
	}
	return buf;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

通过费马小定理求组合数(防止越界,因为做除法之前不能够取余)

转载自:http://blog.csdn.net/xuezhongfenfei/article/details/10100651 费马小定理:a^(p-1) ≡1(mod p)a和p是互质的...

C++ 二进制、十进制、八进制和十六进制 转换

在C++中,默认状态下,数据按十进制输入输出。如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制。但是二进制没有默认的输出...

二进制,八进制,十进制,十六进制转换算法

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents)背景(Contexts)进制转换算法(Convert) (二、八、十六进制) → (十进制) 二进制 →...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不用除法和取余做十进制到二进制十六进制的转换
举报原因:
原因补充:

(最多只允许输入30个字)