加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 建站 > 正文

Java还在纠结原码、补码和反码?其实So Easy

发布时间:2019-07-18 17:33:31 所属栏目:建站 来源:BigDataKer 关注
导读:副标题#e# 平常看jdk源码的时候有很大的感触,就是基础真的很重要,那什么是基础呢?除了java的基本语法之外,最基础的莫过于原码,反码和补码了以及基本的运算了! 1.原码、反码和补码 大家应该都知道,数据在计算机中是以二进制的形式存在的,比如 byte a =

记住在2.2中说的一句话,向右移动的话,最右边超过的部分直接去掉,左边空出来的位置填上和符号位相同的数!说起来很抽象,举个栗子:-6的补码是1111 1010,往右移动一个位置的补码就是1111 1101,是负的,变成原码就知道对应的十进制是多少了。。。。

2.5.无符号右移(>>>)

本来都说了正负数的左移和右移应该就说完了,但是呢,还有一个比较特殊的运算方式,就是无符号右移(注意只有无符号右移,没有无符号左移啊!),简单的来说就是不管正数负数,只要是右移的话,最右边超过的部分直接丢掉,左边空出来的位置都添0就ok了!

好像也没什么可说的,简单举个栗子吧!-6的补码是1111 1010,无符号右移一位的补码就是0111 1101,正的,原码和补码一样,所以对应的十进制是应该是125,然而实际情况有点问题,代码如下:

  1. @org.junit.Test 
  2.  public void num() { 
  3.  byte a = -6; 
  4.  byte b = (byte) (a>>>1); 
  5.  System.out.println(b);//-3 
  6.   
  7.  } 

打印的结果为什么是-3呢?,这里就有一个小小的细节操作,在进行右移操作的时候,首先会将该byte类型的数变成int类型的,对int类型的变原码,然后变补码,移位操作之后,取后8位变为byte类型,然后变原码,最后转十进制。。。。是不是贼麻烦!还是以上面的-6为栗子,-6要进行无符号右移,所以-6的原码应该是32位的

  1. 10000000 00000000 00000000 00000110 //原码 
  2. 11111111 11111111 11111111 11111010//补码 
  3. 011111111 11111111 11111111 1111101//无符号右移一位 
  4. 11111101//取后八位,就是byte类型的补码 
  5. 10000011//byte类型原码,对应十进制是-3  

3.简单总结一下

由于我们是用一个byte类型的为例,这也是为了方便举例子,不然用个int类型的,随便一个数写出原码都是一大串,看着都眼花。。。其实byte类型的移位运算弄清楚了,其他的类型一样的,看了这么多,不知道大家有没有总结出来一点规律,我就说说我的理解吧!

首先,我们要明确当前的数是一个什么类型,进行移位操作之后会不会超出这个类型的范围,如果超出了,我们是不能直接得出乘以2或者除以2这种简单的结论的,会得出一个意想不到的数字;

然后,如果移位操作之后没有超过当前类型的范围,那么就大胆的说左移一位是乘以2,右移一位是除以2向下取整吧!!!

再然后,对于一个正数,左移一位就是最高位去掉,最低位添0;右移一位最高位添加和符号位一样的数,最低位去掉;对于负数而言,也是一样的,就不多说了

最后,就是无符号右移,这里要注意先要变成int类型的二进制原码,变补码,然后进行移位操作,截取后8位为我们需要的byte类型的补码,再变原码,最后就是变成十进制的了。。。

4."或"、"与"、"非"、"异或"

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读