前言

在上一篇文章中,壹哥给大家讲了Java里的各种运算符。其中在讲解位运算符时,我给大家提到了计算机中进制的概念。但是现在很多小白同学,对进制的概念还不够了解,比如二进制、八进制、十六进制都是怎么回事?有什么特点?进制之间怎么转换?原码、反码、补码都是什么意思?......这些问题还困扰着很多童鞋。所以今天壹哥会再利用一篇文章,专门给大家讲解计算机中进制相关的内容,尤其是二进制,你需要认真阅读哦。

------------------------------前戏已做完,精彩即开始----------------------------

全文大约【3600】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

一、进制

1. 概念

首先我们得知道进制的概念。所谓的进制,也叫做进位计数制,这是人为定义的带进位的计数方法。当然也有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法等。

任何一种进制,每一位上的数在运算时都是满X进一位。比如十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,X进制就是逢X进1位。以我们最熟悉的十进制为例,每逢十进一,当数为19时,下一位数的尾数便满足该进制的最大数,于是下一位末位清零,前置位+1,变成20。

2. 分类

在计算机中,目前常用的进制有如下几种:

●十进制;

●二进制;

●八进制;

●十六进制

因为在计算机的底层只能处理二进制格式的数据,也就是0和1,其他的文字、数字、字符等信息都要转换成二进制的格式,计算机的底层才能识别处理。所以作为一个程序员,二进制是我们必须要理解和掌握的哦。

3. 二进制

作为一个程序员,必须要掌握的进制就是二进制了,其实我们只需要参考十进制就可以很容易理解进制的问题了。所谓的二进制,里面只有0和1,且满二进一,所以在二进制里是看不到>=2的数的。比如二进制的前10位数分别是0、1、10、11、100、101、110、111、1000、1001。

4. 八进制

八进制中有0~7共8个数字,但没有8哦,其规则是满八进一,所以7的下一位数不是8,而是10。17的下一位数不是18,而是20。比如八进制的前10位数分别是0、1、2、3、4、5、6、7、10、11......

5. 十六进制

十六进制中有0~F共16个数字,同样没有16,其规则是满十六进一。在十六进制中,这16个数字分别是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。即9的下一位不是10,而是A,10这个数只是十进制的衍生物,这一点大家要注意!

同理,在十六进制中,19的下一位不是20,而是1A,1F的下一位才是20;99的下一位是9A,FF的下一位才是100。

6. 原码、反码与补码

6.1 原码

对一个正整数来说,所谓的原码,就是指一个整数对应的二进制,比如整数10的原码就是00001010。所以原码就是一个正整数原本对应的二进制形式。但负数的原码和正数却不一样,负数的原码要将正数原码的符号位(最高位)改为1,比如-10的原码就是10001010。

6.2 反码

正数的反码就是其原码,即正数的原码和反码完全相同。而负数的反码则是将原码中除符号位以外的所有位(数值位)都取反,即 0 变成 1,1 变成 0。如10的原码和反码都是00001010,而-10的原码是10001010,反码则是11110101。

6.3 补码

正数的补码就是其原码,所以正数的原码、反码、补码都相同。而负数的补码是其反码加1,-10的原码是10001010,反码则是11110101,补码则是11110110。我们可以认为,补码是在反码的基础上打了一个补丁,进行了一点修正,所以叫做“补码”。

所以原码、反码、补码的概念只对负数有实际意义,对于正数来说,原码、反码、补码其实都是一样的,如下图所示:

了解完这些进制的概念之后,接下来壹哥就给大家讲解最重要的进制转换问题,拿出小本本做好记录哦,重点来啦。

二、进制转换

1. 十进制和二进制的转换(掌握)

首先我们来学习十进制与二进制之间的转换,这是必须要掌握的哦。

1.1 十转二

如果我们想将十进制转为二进制,可以采用辗转法,将十进制除以2再取余然后将余数和最后的1按照从下向上倒序写的方法。例如我们想将十进制的302转为对应的二进制,过程如下:

3022 = 151 余0

1512 = 75 余1

752 = 37 余1

372 = 18 余1

182 = 9 余0

92 = 4 余1

42 = 2 余0

22 = 1 余0

12=0 余1

我们将上面每一步得到的余数和最后的1,按照从下向上倒序的方式进行编写,所以302对应的二进制数为100101110。

1.2 二转十

如果我们要把二进制转为十进制,有两种计算方法。

第一种计算方法,是把二进制从最高位(最左边的“1”)开始,先按照从上到下的顺序写出来。先从第1位开始计算0*2,如果每一位上对应的余数是1,在乘以”2“之后还要再加”1“,否则就加0。接着用上一次计算得到的结果乘以2,后面再加1或者是0,以此类推。壹哥给大家用下面的例子进行演示:

例如:100101110

1…………0️2+1=1…………余数为1

0…………1️2+0=2………… 余数为0

0 …………2️2+0=4 ………… 余数为0

1 …………4️2+1=9……………… 余数为1

0…………9️2+0=18 ……………… 余数为0

1 …………18️2+1=37 …………余数为1

1…………… 37️2+1=75…………余数为1

1………………75️2+1=151………… 余数为1

0………………151️2+0=302 ………… 余0

通过这样的计算,我们就可以得到最终的十进制数302

第一种计算方式其实有点复杂,我们可以采用更简单的第二种计算方法。该方法是从最低位开始,每位上的数字*2的N次幂,N从0开始记数(0、1、2......),把每一位的乘积进行累加就是最后的结果。我们把上面的例子换成该方法进行计算,会如下所示:

1*2^8 + 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 302

其实根据第2种计算方法,你可以发现规律。最低位上计算出来的十进制结果最大值就是1,往前一位的最大值是2,以此类推,4、8、16、32、64、128、256.....

所以如果该二进制位上是1,该位置上肯定可以得到对应的十进制最大值,否则只能得到0。比如11111111转成对应的十进制,就可以直接计算:1+2+4+8+16+32+64+128=255

壹哥个人推荐采用这种方式进行计算,简单快捷,基本上我们熟悉之后就可以直接口算出结果。

2. 二进制和八进制的转换(了解)

2.1 八转二

如果你想将八进制转为对应的二进制,可以先将八进制里的每一位一隔,然后分别将每一位换算成3位二进制的格式。比如八进制的764转成对应的二进制111110100,过程如下图所示:

2.2 二转八

如果你想将二进制转为对应的八进制,可以从低位到高位,每三位一隔,将当前三位按照(4 2 1)的方式还原成对应的1位八进制。比如我们将二进制的1100101011转成对应的八进制1453,过程如下图所示:

3. 二进制和十六进制的转换(了解)

3.1 十六转二

如果你想将十六进制转为对应的二进制,可以先将十六进制里的每一位一隔,然后分别将每一位换算成4位(8 4 2 1)二进制的格式。比如十六进制的a8f5转成对应的二进制1010 1000 1111 0101,过程如下图所示:

3.2 二转十六

如果你想将二进制转为对应的十六进制,可以从低位到高位,每四位一隔,将当前四位按照(8 4 2 1)的方式还原成对应的1位十六进制。比如我们将二进制的11 1010 0010 1010转成对应的十六进制3a2a,过程如下图所示:

4. 负数的二进制(了解)

不仅正数可以有对应的二进制,负数也有对应的二进制。在计算机中,任何数据都是以补码的形式进行存储的。正数的原码、补码和反码都完全一样。但是负数的原码、反码、补码却不一样:

负数的原码=将正数的原码符号位(最高位)改为1;

负数的反码=符号位不变,其他位取反;

负数的补码=负数的反码+1。

壹哥在之前的文章中讲过,计算机中,最高位表示符号位,0表示正数,1表示负数。接下来壹哥就以-24和-68为例,给大家讲一下负数的二进制转换。

4.1 负数转为二进制

根据前面的内容,我们可以计算出正数24的原码是00011000(反码、补码也是这个)。所以-24对应的原码就出来了,我们直接将00011000的最高位改成1就行了,即-24的原码是10011000。于是,-24的反码也出来了,最高位不变,其余位全部取反,反码就是11100111。而-24的补码则是反码+1,所以-24的补码=11101000。如下图所示:

4.2 二进制转为负数

既然我们可以将负数转为对应的二进制,当然也可以逆运算。假如我们现在有个二进制,补码是10111100(高位是I表示负数),我们要按照负数转二进制的逆运算进行操作。先计算出该补码对应的反码,反码=补码-1,即反码=10111100-1=10111011。接着根据反码计算出原码,原码=符号位不变,其他位取反=11000100。所以最终对应的十进制数是-68。

5. 小数的二进制(了解)

另外小数和二进制之间也可以实现转换。

5.1 小数转二进制

12.02 0.02*2=0.04

如果我们想将小数转为对应的二进制,整数和小数是分开计算的。如果有整数,则把整数单独转为对应的二进制。小数部分的计算则相对麻烦,主要是小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。例如小数0.125的具体转换过程如下:

1将小数部分0.125乘以2,得0.25,取整数部分0记录下来;

2再将小数0.25乘以2,得0.5,再取整数部分0记录下来;

3再将小数部分0.5乘以2,得到整数1.0,再取整数部分1记录下来。因为1.0的小数点后为零,结束乘2的循环过程。

最终我们得到0.125对应的二进制结果0.001,如下图所示:

5.2 二进制转小数

如果我们想将二进制转为对应的小数,可以从小数点以后开始,依次将当前位数上的数字乘以2的-1到-N次方,再累加。比如我们想将0.0101转为对应的小数,则是0*2-1+1*2-2+0*2-3+1*2-4=0.3125。如果你口算不出来结果,可以用计算器哦。

------------------------------正片已结束,来根事后烟----------------------------

三、结语

至此,壹哥就把计算机中的进制问题给大家讲解完毕了。现在你对进制转换都掌握了吗?其实今天的内容,与Java没有太大关系,所有关于编程开发或计算机技术相关的学习,都应该有进制的基础。所以学习完今天的内容之后,对我们加深理解计算机的底层也是很有帮助的哦。

四、今日作业

第一题

将十进制的520转为二进制,并在评论区给出你的答案,看看你对壹哥的爱有多深,hiahia

第二题

将00110101转为对应的十进制,在评论区给出你的答案。

程序员必须掌握的java进制转换(全网最详细讲解)的更多相关文章

  1. Java进制转换, 数据类型, 运算符

    1:进制转换 转换规则: 先把数据的每一位上的系数乘以对应基数的次幂(低位从零开始),然后相加即可 十进制到其他进制 规则:除基取余,直到商为0,最后将余数反转 十进制到二进制: 除2取余,直到商为0 ...

  2. java进制转换(无视正负数的差别)

    最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤其是对于负数这一方面. 下面和大家分享一下,这里只写了十进制到二进制的转换,其实都是同样的道理 public class Test1 { pub ...

  3. Java 进制转换(二进制(负),八进制,十进制,十六进制),位运算、逻辑运算(2)

    负数的二进制表现形式:其实就是该数的绝对值取反+1. 进制转换(二进制,八进制,十进制,十六进制),原理解析 十六进制的表现形式: (2)(与.异或.左移.右移.三元运算符)

  4. 初学java进制转换方面补充学习

    进制转换: 基础: ​ 二进制用的数为:0/1 ​ 八进制用的数为:0/1/2/3/4/5/6/7 ​ 十进制用的数为:0/1/2/3/4/5/6/7/8/9 ​ 十六进制用的数为:0/1/2/3/4 ...

  5. Java进制转换

    其他转10进制 System.out.println(Integer.parseInt("10", 2));// bin System.out.println(Integer.pa ...

  6. Java进制转换示例

    收藏的代码,以备查询之用.进制之间转换都是以十进制作为中间层的. int os = 16; //十进制转成十六进制: Integer.toHexString(os); //十进制转成八进制 Integ ...

  7. java进制转换代码

    定义十进制的数直接写,定义8进制的数以0开头,定义二进制的数以0b开头,定义十六进制的数以0x开头需要将十进制的数以二进制的数表示出来可以参照下例: int a = 10; System.out.pr ...

  8. java 进制转换

    class Dec2XXX { public static void main(String[] args) { toBin(6); toHex(6); toOct(6); } /*10to2*/ p ...

  9. 黑马程序员_毕向东_Java基础视频教程——进制转换之负数二进制(随笔)

    进制转换之负数二进制 负数的二进制表现形式 6 = 110 -6 : 其实就是 6 的二进制取反再 + 1 一个整数在内存中是占 4 个字节 **取反:将二进制里的 1 变成 0,0 变成 1. 以6 ...

  10. Java基础笔记(3) 进制与进制转换

    ---恢复内容开始--- 进制 在一般生活中,我们一直在应用的十进制,就是逢十进一,而今天我们要接触的是,计算机编程常用的进制!首先我们要知道,计算机内部运算采用的是二进制,也就是逢二进制! 1.什么 ...

随机推荐

  1. 「SOL」数树 (LOJ/WC2019)

    WC 果然还是 WC # 题面 有一张 \(n\) 个点的图,图上有红蓝两种边(可能重叠),且两种边各自形成一个 \(n\) 个点的树. 用 \(m\) 种颜色给图上的所有点染色.若 \(u,v\) ...

  2. xmapp

    下载软件 并开启Apache 创建文本 `<?php echo " 姓名:丁文博 学号:20211306 才艺:打篮球 专业:信息安全 学校:北京电子科技学院 ";` 在网页 ...

  3. js判断变量数据类型typeof、instanceof、Object.prototype.toString.call()、 constructor

    JavaScript有4种方法判断变量的类型,分别是typeof.instanceof.Object.prototype.toString.call()(对象原型链判断方法). constructor ...

  4. nuxt防止第三方ui多次打包

    在nuxt.config.js中的 build:{ extend(){}, verdor:['element-ui'] }

  5. 微信小程序基本总结

    小程序目录结构 project.config.json 配置项目文件,用的最多的就是配置是否开启HTTPS校检 app.js 设置一些全局的基础数据 app.json 设置底部tabbar,标题栏和路 ...

  6. Cortex-M内核指令WFI和WFI

    背景 今天阅读Nordic SDK里的example时发现里面功耗管理使用的power_manage()函数主要就是调用了一个__WFE()函数.查阅资料了解到WFE是一条汇编指令,它可以让CPU内核 ...

  7. jsp第10个作业

    package Servlet; import JDBC.JDBC; import javax.servlet.ServletException; import javax.servlet.annot ...

  8. django_模板层的过滤器和继承

    **************************************************************************************************** ...

  9. 线程安全与数据结构JAVA

    线程 线程与进程本质的区别在于每个进程拥有自己的一整套变量, 而线程之间可以有共享变量.另外创建.销毁一个线程的代价比启动新进程的代价要小. 在java中,没有可以强制线程终止的方法,然而, inte ...

  10. Asp.net zero项目框架和配置