菠菜网

山东枣庄新闻:二进制原码、反码、补码以及Java中的<< 和 >> 和 >>> 详细分析

时间:2个月前   阅读:69   评论:1

1、计算机〖二〗进制系统中最小单【位】bit

【在计算】机〖二〗进制系统中:
bit (【位】) :【数据存储的最小单元】。 简记《为》b,也称《为》比特(bit),每个〖二〗进制数字0或1就是一个【位】(bit),‘其中’,每 8bit = 1 byte(“‘字节’”);

再回顾Java 中的数据类型,如int数据类型 = 4个byte(“‘字节’”),而1 byte(“‘字节’”) = 8 bit(【位】);也就我们常说的int = 32【位】(说白了,在〖二〗进制系统中是以bit 作《为》数据存储单元的)。如下

2、《有符号数 <(〖和〗)>[无符号数》

《有符号数 <(〖和〗)>[无符号数》简单的说就是分别对应正数 <(〖和〗)>[负数,在〖二〗进制系统中是以bit(【位】)【来作《为》数据存储单元的】,最高【位】(“第”一【位】)是符号【位】, 正数符号【位】《为》[“0” ,<负数>符号【位】《为》“1” 。

〖【例子】〗:

『假设』 int number = 1 ,那么number<在计算机系统中将表示如下>:

00000000 00000000 00000000 00000001

同理可得,number = -1 时,在〖二〗进制中表示如下:

10000000 00000000 00000000 00000001

注意:最高【位】(“第”一【位】)是符号【位】,{因《为》}是number值《为》1是一个正数,所以最高【位】《为》0;

3、〖二〗进制{的〖原码〗}、反码、补码

〖原码〗
〖原码〗就是机器数,是加了一【位】符号【位】的〖二〗进制数({因《为》}数值有正负之分), 正数符号【位】《为》[0,<负数>符号【位】《为》1。

反码
「带符号【位】{的〖原码〗}乘除运算时『结果』正确」,而在加减运算的时候就出现了问题,《比如》: 用十进制表示:1 + (-1) = 0, 但用〖二〗进制表示:

00000001 + 10000001 = 10000010,

将『结果』换算成十进制数也就是 -2。于是在〖原码〗的基础上发明了反码,用来解决这种问题。

补码
虽然反码的出现解决了正负数的加减问题, 但却让0这个数字有了两种"形态": "0" <(〖和〗)>["-0", 但这是不合逻辑的,只应该有一个0,所以出现了补码。

《对于有》符号数而言

1、 正数{的〖原码〗}[、反码、补码都一样;
2、负数“的反码” = 『它的原』码符号【位】不变,其他【位】取反(取反的意思:0 换成 1 、 1 换成 0 );
3、负数((的补码)) = 它“的反码” +1;
4、0“的反码”、补码 都是[0;
【特别注意】
1、在计算机运算的时候, 都是[以 补码 的方式来运算的 。
2、〖二〗进制 转《为》 十进制,必须使用 〖二〗进制 {的〖原码〗}进行转换 。

〖【例子】〗:

下面我们就使用[“有符号数”来模拟一下,在计算机中是怎样运算的。

(1)正数相加:

例如:1+1 ,在计算机中运算如下:

1‘{的〖原码〗}《为》’:

00000000 00000000 00000000 00000001

{因《为》}“ 正数{的〖原码〗}[、反码、补码都一样”,所以,1((的补码)) = 1{的〖原码〗},所以 1((的补码))+ 1((的补码)) 就等于:

00000000 00000000 00000000 00000001

  • 00000000 00000000 00000000 00000001

=

00000000 00000000 00000000 00000010

00000000 00000000 00000000 00000010( 转换《为》10进制) = 2

(2)正数相减:

例如:1 - 2,在计算机中运算如下:

“在计算机中减运算其实是作《为》加运算来操作的”,所以,1 - 2 = 1 + ( -2 )

第一步:把 1《((的补码))找出来》({因《为》} 正数{的〖原码〗}[、反码、补码都一样,所以我们可通过〖原码〗直接获取补码):

1((的补码)):

00000000 00000000 00000000 00000001

第二步:把-2{{的〖原码〗}找出来}:

-2{的〖原码〗}:

10000000 00000000 00000000 00000010

第三步:把-2“的反码”找出来:

-2“的反码”:

11111111 11111111 11111111 11111101

第三步:把-2《((的补码))找出来》:

-2((的补码)):

11111111 11111111 11111111 11111110

第四步:1((的补码))与-2((的补码))相加:

00000000 00000000 00000000 00000001

  • 11111111 11111111 11111111 11111110

=

11111111 11111111 11111111 11111111

『第五步』:将计算『结果』((的补码))转换《为》〖原码〗,反其道而行之即可(如果想将〖二〗进制转换《为》十进制,必须得到〖二〗进制{的〖原码〗})

补码:11111111 11111111 11111111 11111111

=

反码:11111111 11111111 11111111 11111110

=

〖原码〗:10000000 00000000 00000000 00000001

第六步:将计算『结果』的〖二〗进制〖原码〗 转换 《为》十进制

〖二〗进制〖原码〗:10000000 00000000 00000000 00000001 = 1*2^0 = -1

4、《思考》:java中《为》什么byte的取值范围是-128~127

java中byte占一个“‘字节’”, 也就是8bit(【位】), ‘其中’最高【位】是符号【位】, 剩下7【位】用来表示数值.若符号【位】《为》0, 则表示《为》正数,范围《为》00000000~01111111(<<补码形式>>),也就是十进制的0-127. 若符号【位】《为》1, {则表示《为》负数}, 范围《为》10000000~11111111(<<补码形式>>), -128~-1, 11111111转换《为》〖原码〗就是10000001,也就是-1。
在补码中,《为》了避免存在"-0",(规定)10000000《为》-128, 【所以解释了】byte的取值范围《为》什么是-128~127.

5、Java中的<< <(〖和〗)>[ >> <(〖和〗)>[ >>>

首先<< <(〖和〗)>[ >> <(〖和〗)>[ >>>是java中的【位】运算符,是针对〖二〗进制进行操作的。(除了这些还有)&、|、^、~、几个【位】操作符。不管是初始值是依照何种进制,都会换算成〖二〗进制进行【位】操作。这里主要讲解Java中的<< <(〖和〗)>[ >> <(〖和〗)>[ >>>。

<< 【表】示左移移,不分正负数,低【位】补0 

注:以下数据类型默认《为》byte《为》8【位】,左移时不管正负,低【位】补0

正数:r = 20 << 2

  20的〖二〗进制补码:0001 0100

  向左移动两【位】后:0101 0000

       『结果』:r = 80

负数:r = -20 << 2

  -20 的〖二〗进制〖原码〗 :1001 0100

  -20 的〖二〗进制反码 :1110 1011

  -20 的〖二〗进制补码 :1110 1100

  左移两【位】后((的补码)):1011 0000

        反码:1010 1111

        〖原码〗:1101 0000

        『结果』:r = -80

‘ >> ’表示右移,如果该数《为》正,则高【位】补0,若《为》负数,则高【位】补1;

注:以下数据类型默认《为》byte《为》8【位】

正数:r = 20 >> 2 

  20的〖二〗进制补码:0001 0100

  向右移动两【位】后:0000 0101

       『结果』:r = 5

负数:r = -20 >> 2 

  -20 的〖二〗进制〖原码〗 :1001 0100

  -20 的〖二〗进制反码 :1110 1011

  -20 的〖二〗进制补码 :1110 1100

  右移两【位】后((的补码)):1111 1011

        反码:1111 1010

        〖原码〗:1000 0101

        『结果』:r = -5

‘ >>> ’ 「表示无符号右移」,也叫逻辑右移,即若该数《为》正,则高【位】补0,而若该数《为》负数,则右移后高【位】同样补0 

注:以下数据类型默认《为》int 32【位】

正数: r = 20 >>> 2

    的『结果』与 r = 20 >> 2 相同;

负数: r = -20 >>> 2

  -20〖原码〗:10000000 00000000 00000000 00010100

    反码:11111111 11111111 11111111 11101011

    补码:11111111 11111111 11111111 11101100

    右移:00111111 11111111 11111111 11111011

    『结果』:r = 1073741819

最后,若有不足或者不正之处,欢迎指正批评,感激不尽!

欢迎各【位】关注我的公众号,(里面有一些)java学习资料 <(〖和〗)>[一大波java电子书籍,《比如》说周志明老师的深入java虚拟机、java【编程思想】、核心「技术」卷、大话设计模式、java〖并发编程实战〗..... 都是[java『的圣经』,不说了快上Tomcat车,咋们走!最主要的是一起探讨「技术」,向往「技术」,『追求「技术」』,说好了来了就是盆友喔...

参考:
https://www.cnblogs.com/summerdata/p/10722359.html
https://www.cnblogs.com/chuijingjing/p/9405598.html

,

‘申博’Sunbet

‘申博’Sunbet www.eyaeya.com <(〖和〗)>[EYAEYA网强强联合,打造一站式全民直营平台,「用资本」、「技术」、服务在同行中获胜。Sunbet <(〖和〗)>[EYAEYA网提供数十种线上纸牌、zhenren、电子游戏,(致力打造公平公开公正的信誉平台)。

上一篇:菠菜网址:【不涉第三者】「父女恋」21年 焦媛认年多前与高志森分手

下一篇:证明商标:重演SARS法拍量爆增? 专家点关键因素

网友评论

  • 2020-08-06 00:00:29

    allbet欢迎进入allbetGaming网址:www.aLLbetgame.us。AllbetGaming网址开放AllbetGaming代理会员登录网址、AllbetGaming会员开户、AllbetGaming代理开户、AllbetGaming客户端下载、AllbetGamingAPP下载等业务。下笔如有神