java位操作运算

2019-04-14

虽然应用场景不多,但是一些源码里却出现了很多次。并非没有用。

在计算机中,所有数值都是 二进制数值。

```byte 1个字节 8位short 2个字节 16位int 4个字节long 8个字节float 4个字节double 8个字节char 1个字节boolean 1位```

 

## 操作对象数值在计算机中所有数都是以补码形式存储,正数最高位 0,负数最高位 1,正数三码合一,负数原码、反码、补码 分别应:对应正数最高位变1、最高位外 所有位取反、补(加)1

### 原码一个数字转换成二进制就是它的原码,如:

```int a=5;//0000 0000 0000 0000//0000 0000 0000 0101 -5 即在 5最高位用1//1000 0000 0000 0000//0000 0000 0000 0101```

### 反码分两种情况,正数反码即是原码,负数是 符号位不变的基础上 其他位取反。

### 补码也分两种情况,正数补码即原码,负数补码是 反码加1。

负数补码==对应正数全部取反+1;

## 操作符

& 与运算符

从低到高对应,都是1 则是 1,其他都是 0

| 或运算符

有一个1 就是 1,否则 0

~ 取反

对每一位进行操作,1变 0 ,0 变1

^ 异或运算符

两个操作位 不一样是 1,一样是 0

>> 右移运算符

a>>b将数值a的二进制数 向右 移 b位,高位空出来的补零

>>有符号右移 //补码右移,正数补0,负数补1
  如 -4>>2
  4:前面0都是100
  -4:011+1==前面1都是100
  右移两位:(1)(1)前面1都是1==1111111111111111111就是数字1啊啊啊  记住这guo东西 负数补码==对应正数全部取反+1;
>>>无符号右移 无论正负数,最高位是1,0都是补0  负数补码补0、正数补码即原码
a/2^b