07 位运算符

位运算符

一、位运算符的介绍

  • Java中有七个位运算符( & 、| 、 ^ 、 ~ 、 >> 、 << 、 >>>)
  • 按位与& : 相对映的位置上两位全为1,结果为1,否则为0

  • 按位或| :两位有一个为1,结果为1,否则为0

  • 按位异或^ :两位一个为0一个为1,结果为1,否则为0

  • 按位取反~ :0 ——> 1 1 ——> 0

  • 算术右移>> :低位溢出,符号位不变,并用符号位补溢出的高位(本质:右移一位除以一个2)

  • 算术左移<< :符号位不变,低位补0(本质:左移一位乘以一个2)

  • 逻辑右移也叫无符号右移>>> :低位溢出,高位补0

  • !特别说明:没有<<<符号

二、案例解析

  1. 2 & 3
System.out.println(2 & 3);
/*
解析:
(1)计算机内运算以补码的方式进行——>先得到补码
(2)2和3都是正数,正数三码合一,原码就是补码
(3)2的补码:00000000 00000000 0000000 00000010
   3的补码:00000000 00000000 0000000 00000011
(4)按位与&
2:    00000000 00000000 0000000 00000010
3:    00000000 00000000 0000000 00000011
2&3:  00000000 00000000 0000000 00000010
(5)结果看原码 00000000 00000000 0000000 00000010
转成十进制,先看符号位再看其它位,结果为2
*/
  1. ~-2
System.out.println(~-2);
/*
解析:
(1)先得到补码,负数的补码 = 反码 + 1
(2)反码 = 原码符号位不变,其他位取反
-2原码: 10000000 00000000 00000000 00000010
反码: 11111111 11111111 11111111 11111101
补码: 11111111 11111111 11111111 11111110
(3)~-2: 00000000 00000000 00000000 00000001
注意:取反操作是包含符号位在内的!!!
(4)结果看原码
原码: 00000000 00000000 00000000 00000001
符号位为0是正数,正数的原码补码一样
结果为1
*/
  1. ~2
System.out.println(~2)
/*
解析:
(1)先得补码,正数三码合一
原码 = 补码 = 00000000 0000000 0000000 00000010
(2)~2: 11111111 11111111 11111111 11111101
(3)结果看原码,负数的反码 = 补码 - 1
反码: 11111111 11111111 11111111 11111100
(4)反码 = 原码符号位不变,其他位取反
原码: 10000000 00000000 00000000 00000011
结果为-3

*/

本文章使用limfx的vscode插件快速发布