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

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

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

请注意“或”、“与”、“非”和java中的||、&&、!别弄混淆了,java中的这几个是用来进行逻辑判断的,而我们这里的“或”“与”“异或”这几个是用来计算二进制的,完全没有什么相关,虽然写法有点类似,“或”用一根竖线表示|,与用一个&表示,非用~表示,"异或"用^表示,下面就简单说说他们的作用:

或:在二进制中,两个操作数进行或操作,只要有一个为1,结果就为1,否则就为0;举个例子,-6|3,首先将各自都变为补码,也就是变为(1111 1011)|(0000 0011),根据下图,最后计算的补码为1111 1011,变为原码为1000 0101,对应十进制的-5,所以-6|3的结果就是-5!很简单吧,现在应该知道操作数是什么了吧!

JAVA还在纠结原码、补码和反码?其实So Easy
  1. public void num() { 
  2.  byte a = -6; 
  3.  System.out.println(~a);//5 
  4.   
  5.  } 

与:两个操作数同时为1,结果才是1,否则为0;

异或:看这个名字就知道了,两个操作数不同结果就是1,否则为0;

非:就是对自己取反(符号位也要取反),用法如下,因为-6的补码是1111 1010,取反之后的补码0000 0101,对应十进制的5

  1. public void num() { 
  2.  byte a = -6; 
  3.  System.out.println(~a);//5 
  4.   
  5.  } 

5.简单练习

如果把上面的都看懂了,理解了那么下面这个就很容易了;

直接说一下这个方法的用处,就是你随便输入一个int类型的数,它都会给你返回一个2的次幂数,比如1,2,4,8,16.32.64等这种数(1等于2的零次幂,也是2的次幂数)

  1. static final int tableSizeFor(int cap) { 
  2.  int n = cap - 1; 
  3.  n |= n >>> 1; 
  4.  n |= n >>> 2; 
  5.  n |= n >>> 4; 
  6.  n |= n >>> 8; 
  7.  n |= n >>> 16; 
  8.  return (n < 0) ? 1 :n + 1; 
  9.  } 

这个方法其实很容易,就是将传进去的int类型的cap首先减一,赋值给n,然后n进行5次无符号右移操作,每次右移之后都和n进行"或"操作,最后判断n如果小于零,就返回1,否则就返回n+1

(编辑:惠州站长网)

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

推荐文章
    热点阅读