Java二进制存储说明/计算机二进制的存储(原码,反码,补码的说明)

一,二进制的算法
是将一个数进行处于2得到的余数1,或0进行收集!
余数收集是从最下向上进行依次排列
如:
5的二进制应该是:0000 0101
而转化为十进制应该是:从最低为乘以2的0次方开始依次进行相加
最低为: 从左往右开始算,那么1就是最低位
最高位:从右往左开始算,那么0就是最高位

而数据类型byte,short等等是如何通过二进制来进行?
以byte为例: byte是以一个字节为单位,
且一个字节有8位,并且大小是-128~127的范围
其中java中:最高位为符号位置,也就是常说的正负符号
0:为正!
1:为负!
127的二进制表示为: 0111 1111
其中0表示为符号位,且为正!
-128的表示方法是 -0,这是另外一种规定的方式!
且所有的数据类型都是由-0表示最小数!

二, java二进制的存储方式:
二进制分为:原码,反码,补码!
其中规定:正数的原码,反码,补码都是不变得
负数的原码,最高位(符号位)不变,其它0<->1,也就是0转化为1,1转化为0!
而补码,就是在最低位上进行加1,逢2进1的方式
比如:-5 的补码:
原码:1000 0101
反码:1111 1010
补码:1111 1011
-------------------------------------------------------------------------
注意: java的位运算只能针对整数的补码进行的
--------------------------------------------------------------------------
三,java二进制的加法运算:
先转化为补码进行与运算,然后转化为十进制变成相应的数字!
1+0 为1
0+0 为0
1+1 为0 且进1
比如:5+6
5:0000 0101
6:0000 0110
最低位开始加起:1+0=1
第二低位相加:0+1=1
第三低位相加:1+1=10
最后得出:0000 1011
由于正数的,原码,反码,补码一致不变:结果为11

四,java二进制的减法运算,然后转化为十进制变成相应的数字!
同样以:5-6为例
5:0000 0101
6:0000 0110
最低位开始相减:1-0=1
第二低位相减:0向前一位借位为2,那么就是2-1=1
第三位相减:1由于向第二低位借位变为0,那么0需要往前借1位,那么就是2,2-1=1
其余的由于从前借了一位,都会变成1.
1111 1111,此为补码,由于最高位为1,则数字为负
对于负数从补码到反码是-1,则 1111 1010
原码为:1000 0001 结果为 -1

五,java二进制的乘除法运算:
参考百度百科:
参考文地址:https://baike.baidu.com/item/二进数乘法/22761415?fr=aladdin
比如:110010 * 1011
按位进行乘法运算:
110010
* 1011
---------------
110010(解释:1011的最低位1 乘以 110010,结果为110010)
110010
000000
110010
------------------------
1000100110 (将上面的位数进行相加,得出当前的二进制)
参考文地址:https://baike.baidu.com/item/二进数乘法/22761415?fr=aladdin
比如:1000100110 / 1011 (除法的解释)
1000100110
1011 (按照除法就是10001 - 1011)=1100 | 除数为1

                      1100
                      1011   (按照除法就是 1100  - 1011)=1011    |  除数为1 0 0

                       1011
                       1011  (按照除法就是 1011 - 1011)  |  除数为1

                             0
------------------------------------------------------------------------
最终结果是:110010  (也就是跟除法一样的按位运算。。。。。。)
--------------------------------------------------------------------------

六,java二进制的左移与右移动
比如:5左移动2位
写法: 5<<2
0000 0101
左移动后的结果如下:
0001 0100
结果是:20
在一定范围内:左移就是在原有的数字上面,乘以2的移动位次幂!
如果:5右移2位
写法:5>>2
0000 0101
右移动后的结果如下:
0000 0001
结果是:1
在一定范围内:右移就是在原有的数字上面,除以2的移动位次幂!
并且,需要忽略掉小数部分!

如果超出了范围了:
比如:5左移动32位,或者33位呢
规定上是移动位对数据类型的位数进行取整,注意,当前的5的类型是 “ ”int“ ”类型,有4个字节,共8位
00000000  00000000 00000000 00000000
那么32对32取余为0,则就是左移动了0位,结果还是为5;
如果是33,则是33对32取余为1,则就是左移动了1位,结果为5*2的1次方,结果为10;
 ---------------------------------------------------------------------

七,java的左移动与右移动对于负数来说的的结果
-5<<2
原码:1000 0101
反码:1111 1010
补码:1111 1011 解释:补码是在最低为加1
右移2位后:1110 1100
负数的补码变反码是减1:1110 1011
反码转原码:1001 0100
结果:-20
-5>>2
原码:1000 0101
反码:1111 1010
补码:1111 1011 解释:补码是在最低为加1
左移2位后:1111 1110
反码:1111 1101
原码:1000 0010
结果:-2
---------------------------------------------------------------
说明:不管正负的想左移都是低位补0
而右移是: 正数:最高位补0
负数:最高位补1
且正数的右移最小为0
负数的右移最大为-1
------------------------------------------------------------------------------------------------------
八,java的取反运算:
符号:~
对5进行取反:~5
原码:0000 0101
正数的原码,反码,补码都是为原二进制数
补码:0000 0101
不敢正负去反,都是0变成1,1变成0
取反:1111 1010(补码)
补码变反码:1111 1001 (由于取反以后的最高位为1,则认定此数 为负数,所以按照负数的原码,反码,补码进行运算)
反码变原码:1000 0110
结果为:-6

     如果对 -5进行取反:~(-5)
     原码:1000 0101
     反码:1111 1010
     补码:1111 1011
     取反:0000 0100
     正数的原,反,补码一致则结果为:4

结论:对某个数字进行取反,那么就是在他原有的基础上自己增加一个负数(-)符号,再减1
公式:~X = -X-1

八, & 与运算/ ‘|‘ 或运算/ ‘^’ 异或运算
1,& 与运算 相同为1的才能为 1,其余为 0
2,‘|‘ 或运算 相同为0的才能为 0,其余为 1
3,‘^’ 异或运算 相同为 0 不同为 1;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值