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

原创 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;
}

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

二进制、八进制、十进制、十六进制之间转换

转载——链接
  • qq_25223941
  • qq_25223941
  • 2015年12月07日 18:37
  • 2386

二进制、八进制、十进制、十六进制之间的转换

二进制八进制之间的转换   二进制与八进制之间的关系式每个八进制位对应三个二进制位,详情如下:   八进制:  0    1     2    3     4    5     6    7   ...
  • Scofy0
  • Scofy0
  • 2015年12月16日 15:27
  • 959

十进制转化为二进制与十六进制显示(汇编程序)

stacks segment stack dw 200h dup(0);不太明白要200h这么大 stacks ends data segment in_buf db 6;定义输入字符串最大长度 in...
  • normol
  • normol
  • 2016年12月17日 17:05
  • 2049

C#中二进制、十进制和十六进制互相转换的方法

二进制、十进制、十六进制相互转换
  • hit_why
  • hit_why
  • 2016年12月21日 14:41
  • 9511

C++实现二进制、八进制、十进制、十六进制的相互转换

为了练手,也为了回顾C++基础,最近将坚持写一些小程序贴出来,做记录的同时也希望能对他人有帮助。 用C++实现的各进制之间的转换程序 各进制特点省略,只关注与怎样实现转换。其实网上有很多进制转换的...
  • leijferrari
  • leijferrari
  • 2014年04月25日 14:53
  • 5017

利用栈实现二进制转换为八、十、十六进制

#include #include #include using namespace std; /*-----------------------------栈的建立-------------...
  • dancheng1
  • dancheng1
  • 2016年08月29日 10:25
  • 359

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

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents)背景(Contexts)进制转换算法(Convert) (二、八、十六进制) → (十进制) 二进制 →...
  • meegomeego
  • meegomeego
  • 2015年11月20日 16:14
  • 12914

任意长度的十进制数转为二进制、十六进制,和大数除法算法(只有小半份)

辗转求余法实现的任意长度十进制数到2进制和16进制转换方法
  • Runnerchin
  • Runnerchin
  • 2017年07月24日 16:11
  • 581

【Python】Python实现进制转换(二进制、十进制和十六进制)及注意事项

使用内置函数实现进制转换实现比较简单,主要用到以下函数: bin()、oct()、int()、hex() 下面分别详解一下各个函数的使用(附实例) 第一部分:其他进制转十进制 1.二进制转十进...
  • ghxbob
  • ghxbob
  • 2013年10月05日 17:43
  • 3575

Unicode 码和汉字,十进制之间互转!二进制、十六进制,十进制的转换

Unicode 码和汉字,十进制之间互转!二进制、十六进制,十进制的转换
  • liangrui1988
  • liangrui1988
  • 2014年02月14日 23:34
  • 3372
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不用除法和取余做十进制到二进制十六进制的转换
举报原因:
原因补充:

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