黑马程序员技术交流社区

标题: 问一个关于进制的问题 [打印本页]

作者: 沙漠侧行者    时间: 2014-5-5 21:06
标题: 问一个关于进制的问题
一个十进制的负数可以通过取反加一的方式转换成一个二进制数,那么转换成的二进制数应该怎么转换成一个其他进制的数?
比如-1可以转换成二进制数:1111 1110 该二进制数该怎么转换成一个16进制或者8进制的数?
作者: 想飞的鱼    时间: 2014-5-5 21:36
负数的二进制是其绝对值的二进制取反再加1,所以,-1的二进制求法如下:
1) 绝对值二进制 0000-0000 0000-0000 0000-0000 0000-0001
2)取反                1111-1111 1111-1111 1111-1111 1111-1110
3)加1              + 0000-0000 0000-0000 0000-0000 0000-0001
                        ------------------------------------------------------
                            1111-1111 1111-1111 1111-1111 1111-1111
换算成16进制每4位当一位:即 FFFFFFFF
8进制每3位当一位:即37777777777
作者: 沙漠侧行者    时间: 2014-5-5 22:05
上面的哥们,这些转换对吗?
作者: 646245771    时间: 2014-5-5 22:26
本帖最后由 646245771 于 2014-5-6 19:30 编辑

首先先把一个整数的转二进制、八进制、十六进制给楼主详细讲解一下,这都是万变不离其宗的,拿60为例吧:
  1. 0000 0000 0000 0000 0000 0000 0011 1100  //这是60的二进制
复制代码


60的八进制怎么算呢?很简单,因为八进制是满8进一,所以最大的数只能取到7,也就是三个二进制位换算成一个八进制位,可以得到以下结果
  1. 000 000 000 000 000 000 000 000 000 111 100 // 不足三个二进制的话,用0补,
  2. 0   0   0   0   0   0   0   0   0   7   4
  3. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. 60 的二进制就是 74
复制代码

60的十六进制,同八进制一样,只不过是满16进一,所以最大的数只能取到15,也就四个二进制位换算成一个十六进制位,可以得到以下结果
  1.   0000 0000 0000 0000 0000 0000 0011 1100
  2.   0    0    0    0    0    0    3    C //超过9的值,用A(10)、B(11)、C(12)、D(13)、E(14)、F(15)表示
  3. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. 60 的二进制就是 3C
复制代码
负数的话,就是同理啊,先把-1换算成二进制,然后同上述办法就行了。 -1 = 1取反+1 等于
  1. 0000 0000 0000 0000 0000 0000 0000 0001  = 1
  2. 1111 1111 1111 1111 1111 1111 1111 1110  取反
  3. 0000 0000 0000 0000 0000 0000 0000 0001   +1
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. 1111 1111 1111 1111 1111 1111 1111 1111   =-1

  6. 这是-1的 二进制
  7. 11 111 111 111 111 111 111 111 111 111 111
  8. 3   7   7   7   7   7   7   7   7   7   7  
  9. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  10. 这是-1的 八进制

  11. 1111 1111 1111 1111 1111 1111 1111 1111
  12.   F    F    F    F    F    F    F    F
  13.   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  14. 这是十六的
复制代码
如果想再转成十进制,那就按照相反的方法,把二进制再取反+1,怎么可能数值发生改变呢?



作者: 姜蕾蕾    时间: 2014-5-5 22:37
只是说一下自己的思路哈,有什么不对的欢迎指出来,感觉2楼的方法有问题,-1 换成其他进制就变成正数了吗?二进制是机械码,虽然表示起来可能不太一样,但是表示出来的数应该是不能变的,否则,存储起来数值变了的话,那么存储的意义在哪里啊,个人认为,对于负的二进制数,应该先取反加一,变成他的正数,然后再用三位2进制位变一位8进制位,或者4位二进制位变一位16进制位的方法,然后再加一个负号就行了吧,8进制,16进制不是机械码嫁,跟10进制一样,加负号就行了吧……
作者: ☆枫の云    时间: 2014-5-5 23:35
我感觉这个很简单啊...=.=,
三个二进制位是一个八进制位,四个二进制位是一个十六进制位,
二进制数转八进制:011  111  110-->3 7 6
二进制转十六进制:1111 1110-->F  E

不信你可以用计算器验证=.=
作者: 沙漠侧行者    时间: 2014-5-6 00:08
姜蕾蕾 发表于 2014-5-5 22:37
只是说一下自己的思路哈,有什么不对的欢迎指出来,感觉2楼的方法有问题,-1 换成其他进制就变成正数了吗? ...

和你想的一样的...
作者: 沙漠侧行者    时间: 2014-5-6 00:12
646245771 发表于 2014-5-5 22:26
按照楼主说的-1来算的话,分析起来,怕楼主看的不够直观跟明确,咱们就以60为例吧。60的二进制是

不敢苟同

3   7   7   7   7   7   7   7   7   7   7  

F    F    F    F    F    F    F    F
应该不是正数吧
作者: 沙漠侧行者    时间: 2014-5-6 00:14
姜蕾蕾 发表于 2014-5-5 22:37
只是说一下自己的思路哈,有什么不对的欢迎指出来,感觉2楼的方法有问题,-1 换成其他进制就变成正数了吗? ...

你名字是姜蕾蕾吗?现在在上0428 Java基础班是吧?
作者: 沙漠侧行者    时间: 2014-5-6 00:15
☆枫の云 发表于 2014-5-5 23:35
我感觉这个很简单啊...=.=,
三个二进制位是一个八进制位,四个二进制位是一个十六进制位,
二进制数转八进 ...

二进制转十六进制:1111 1110-->F  E
负数转成正数?
作者: ☆枫の云    时间: 2014-5-6 11:41
沙漠侧行者 发表于 2014-5-6 00:15
二进制转十六进制:1111 1110-->F  E
负数转成正数?

看错了=.=,-1的二进制我就按你给的1111 1110算的,应该是1111 1111 1111 1111 1111 1111 1111 1111,所以楼上那两哥们儿回答的应该是对的,你可以用计算器验证的,想传个图,可惜权限不够,哎
作者: 646245771    时间: 2014-5-6 19:32
沙漠侧行者 发表于 2014-5-6 00:12
不敢苟同

3   7   7   7   7   7   7   7   7   7   7  

这肯定不是正数啊   这就是 -1的二进制、八进制、十六进制  要是想取成正数,把负数的二进制再取反+1即可,数值怎么会发生改变呢?我不明白楼主是怎么理解的 :L
作者: 名字难取    时间: 2014-5-6 19:34
顶了AAAA
作者: 沙漠侧行者    时间: 2014-5-7 16:19
在网上查了一下资料, 想飞的鱼 646245771 ☆枫の云 的回答应该是正确的,看来是我想多了
作者: 姜蕾蕾    时间: 2014-5-14 22:45
沙漠侧行者 发表于 2014-5-6 00:14
你名字是姜蕾蕾吗?现在在上0428 Java基础班是吧?

楼主认识我吗?你也是我们班的?
作者: 沙漠侧行者    时间: 2014-5-17 21:03
姜蕾蕾 发表于 2014-5-14 22:45
楼主认识我吗?你也是我们班的?

是滴 我认识你
作者: 姜蕾蕾    时间: 2014-5-17 23:04
沙漠侧行者 发表于 2014-5-17 21:03
是滴 我认识你

你是我们班的吗,是谁?:victory:
作者: 墨香    时间: 2014-5-17 23:23
本帖最后由 墨香 于 2014-5-17 23:28 编辑

这是计算机专业的问题,给你详述下吧:
计算机中常用的数的进制主要有:二进制、八进制、十六进制,学习计算机要对其有所了解。
2进制,用两个阿拉伯数字:0、1;
8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;
10进制,用十个阿拉伯数字:0到9;
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。
以下简介各种进制之间的转换方法:
一、二进制转换十进制
例:二进制 “1101100”
1101100 ←二进制数
6543210 ←排位方法
例如二进制换算十进制的算法:
1*26 + 1*25 + 0*24 + 1*23 + 1* 22 + 0*21 + 0*20
↑ ↑
说明:2代表进制,后面的数是次方(从右往左数,以0开始)
=64+32+0+8+4+0+0
=108
二、二进制换算八进制
例:二进制的“10110111011”
换八进制时,从右到左,三位一组,不够补0,即成了:
010 110 111 011
然后每组中的3个数分别对应4、2、1的状态,然后将为状态为1的相加,如:
010 = 2
110 = 4+2 = 6
111 = 4+2+1 = 7
011 = 2+1 = 3
结果为:2673
三、二进制转换十六进制
十六进制换二进制的方法也类似,只要每组4位,分别对应8、4、2、1就行了,如分解为:
0101 1011 1011
运算为:
0101 = 4+1 = 5
1011 = 8+2+1 = 11(由于10为A,所以11即B)
1011 = 8+2+1 = 11(由于10为A,所以11即B)
结果为:5BB

作者: 沙漠侧行者    时间: 2014-5-17 23:29
本帖最后由 沙漠侧行者 于 2014-5-17 23:41 编辑

                                                     




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2