一、原码、反码、补码

1  用二进制表示                00000001
-1 如果只变符号位(原码) 10000001
那么 1 + -1 = 10000010 = -2
-1 的反码 11111110 除去符号位,整体翻转
-1 的补码(反码加 1) 11111111 补码 也等于 0 - 1 的原(补)码
1 的补码 + -1 的补码 10000000 = 0, 溢出 1 位

int 为 4 个字节,32 位,1 位作为符号位,表示大小的有 31 位

为了方便运算,Java 整数二进制默认使用补码表示正数和 0 的补码不变,负数的补码为反码加 1

0:        00000000000000000000000000000000  32个0
2^32-1: 01111111111111111111111111111111 0 + 31个1
-2^31: 10000000000000000000000000000000 1 + 31个0
-2^31+1: 10000000000000000000000000000001 1 + 30个0 + 1
-1: 11111111111111111111111111111111 32个1
String s = Integer.toBinaryString(0x80000000); // 0x80000000: -2^31
  • 1111 = 15 = 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0,0001 为 1,等于 2^0

二、移位运算符

<< : 左移运算符

num << 1,num 转换为二进制,长度固定,丢弃最左边指定位数,1 位,整体向左移动 1 位,后面补 0。

以 int 类型为例,4 个字节,32 位,表示 -2^31 ~ 2^31 - 1,10000000000000000000000000000000 ~ 01111111111111111111111111111111,最左位是符号位,当小于 2^31 - 1 时,最左边都是 0,所以 0 代表为正数,1 代表为负数。

当 num 为正数,且没有达到最大值时,即左边的 0 够多时,num << 1 相当于二进制每一位转十进制时在原来基础上再乘以 2,相当于 num 乘以 2。达到最大值后,正数可能变负数。

>> : 右移运算符

num >> 1,num 转换为二进制,丢弃最右边指定位数,1 位,整体向右移动 1 位,后面补符号位,如果 num 为正数,补 0,如果为负数,补 1。

当 num 为正数时,num >> 1 相当于 num 除以 2 取整(/)。

int 类型 4 字节,正数右移 31 位变为 0,右移 32 位相当于不移位,当大于 32 位时,先求余,再移位。long 类型 64 位取余。

>>> : 无符号右移运算符

丢弃最右边指定位数,整体右移指定位,忽略符号位,后面空位都以 0 补齐。

因为左边没有符号,所以没有无符号左移。或者说,左移运算符就是无符号左移。

    public static void main(String[] args) {
int intValue = 733183670;
int intValue2 = -733183670;
System.out.println(intValue + " 左移 1 位:" + (intValue << 1)); // 1466367340
System.out.println(intValue2 + " 左移 1 位:" + (intValue2 << 1)); // -1466367340
System.out.println(intValue + " 右移 8 位:" + (intValue >> 8)); // 2863998 (733183670/256)
System.out.println(intValue2 + " 右移 8 位:" + (intValue2 >> 8)); // -2863999
// 无符号右移,将数据变小,且最终为正数
System.out.println(intValue + " 无符号右移 8 位:" + (intValue >>> 8)); // 2863998
System.out.println(intValue2 + " 无符号右移 8 位:" + (intValue2 >>> 8)); // 13913217
}

733183670 << 1,左移 1 位:

-733183670 >> 8,右移 8 位:

-733183670 >>> 8,无符号右移 8 位:

三、位运算符

  • 先转换为二进制后再运算
  • & 按位与:1&1==1 / 1&0==0 / 0&0==0,都为 1,则为 1,否则为 0
  • | 按位或:1|1==1 / 1|0==1 / 0|0==0,有一个为 1,则为 1,否则 为 0
  • ~ 按位非:~1==0 / ~0==1, 单位为 bit,整数类型的话:~1==-2 -->~0b00000000000000000000000000000001==0b11111111111111111111111111111110
  • ^: 异或运算符 1^1==0 / 1^0==1 / 0^0==0,相同为 0,不同为 、1

四、逻辑运算符

  • && 逻辑与:当左边表达式为 false 时,不再计算,直接为 false。规则跟 & 一致
  • || 逻辑或:当左边表达式为 true 时,不再计算,直接为 true。规则跟 | 一致

五、延伸阅读

最新文章

  1. 初识The Battle of Polytopia
  2. 第一个c++程序
  3. Microsoft SQL Server,错误: 229 解决方案
  4. Android 学习笔记之Volley开源框架解析(三)
  5. 6、XML(2)
  6. java_Properties写入文件
  7. python学习之旅:array 转 list
  8. intent的startActivityForResult()方法
  9. springmvc配置首页的方式
  10. C++编程规范(不断更新)
  11. windows10 docker镜像存储位置修改
  12. HDU-1695 莫比乌斯反演
  13. Java并发编程(六)volatile关键字解析
  14. EntityFramework Code-First 简易教程(十一)-------从已存在的数据库中映射出表
  15. 绝对精品推荐做前端的看下:Web前端开发体会十日谈
  16. 用tsMuxeR GUI给ts视频添加音轨
  17. npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script build`?
  18. python3学习笔记(9)_closure
  19. Linux防火墙(Firewalls)
  20. Git4:Git标签

热门文章

  1. error rabbitMQ:Error: unable to perform an operation on node &#39;rabbit@xxxx&#39;.
  2. EM算法的收敛性
  3. 05 drf源码剖析之认证
  4. python 生成器(五):生成器实例(一)创建数据处理管道
  5. python之class面向对象(进阶篇)
  6. typeError:The value of a feed cannot be a tf.Tensor object.Acceptable feed values include Python scalars,strings,lists.numpy ndarrays,or TensorHandles.For reference.the tensor object was Tensor...
  7. Cyber Security - Palo Alto Firewall Security Zones
  8. javascript实战 : 简单的颜色渐变
  9. javac不是内部或外部命令,也不是可运行的程序或批处理文件的错误解决方法(Windows10/Windows7)
  10. .Net Core 常见错误解决记录