位运算符

位运算符

java定义了位运算符,应用于short(短整型)、int(整数类型)、long(长整型)、byte(字节型)、char(字符型)。位运算表示对每个二进制位(bit)进行计算,其操作数和运算结果都是整数型。

位运算符主要针对二进制(补码),按照低位到高位一一对齐运算。

  • 位逻辑运算符包括:&(与)、|(或)、~(非)、^(异或)。除了~为单目运算符外,其余都为双目运算符。
  • 位移运算符包括<<(左移运算符)、>>(右移运算符)、>>>(无符号右移运算符)。

&运算

”与“运算符:相对应位都为1,结果才为1。否则为0。

1
2
3
0 & 0 = 0;
1 & 0 = 0;
1 & 1 = 1;

|运算

”或“运算符:相对应位只要有一个为1,结果就为1。否则为0。

1
2
3
0 | 0 = 0;
1 | 0 = 1;
1 | 1 = 1;

逻辑运算符”&&”和”||”与位运算符”&”和”|”的区别:”&&”和”||”运算具有短路计算功能。

~运算

”非“运算符:取反,1变成0,0变成1;

^异或运算

”异或“运算符:用符号 XOR 或 ^ 表示。两个操作数进行异或运算时,对于同一位上,如果相同为0,不同则为1。

1
2
3
0 ^ 0 = 0;
1 ^ 0 = 1;
1 ^ 1 = 0;

性质:

  • 任何数,与自己异或运算,结果为0。 a^a=0。
  • 任何数,与0做异或运算,结果不变。 a^0=a。
  • 满足交换律和结合律。(a^b)^a=(a^a)^b=0^b=b。
  • 根据以上可得,自反性。a ^ b ^ b=a。a与b做两次异或运算,可得原始数据a。

<<运算

左移位运算:按二进制形式把操作数向左移动指定位数。高位移出(舍弃)、低位的空位补零

1
2
3
4
5
6
7
3 << 2
3转换为二进制数字:00000000 00000000 00000000 00000011
左移2位后为: 00000000 00000000 00000000 00001100(十进制12

-3 << 2
-3转换为二进制为: 11111111 11111111 11111111 11111101(取补码)
左移2位后为: 11111111 11111111 11111111 11110100(为补码,十进制为-12
  • 数学意义:在数字没有溢出的前提下,左移一位相当于乘以2的一次方。左移n位相当于乘以2的n次方。

>>运算

右移位运算:按二进制形式把操作数向右移动指定位数。
低位移出(丢弃)、高位的空位补符号位(正数补0、负数补1)

1
2
3
4
5
6
7
8
9
10
16 >> 2
16转换为二进制为:00000000 00000000 00000000 00010000
右移两位后 00000000 00000000 00000000 00000100(十进制4

-16 >> 2
-16 原码:10000000 00000000 00000000 0001000016的原码基础上将符号位改为1
-16 反码:11111111 11111111 11111111 11101111(符号位不变,数值部分取反)
-16 补码:11111111 11111111 11111111 11110000(在反码基础上,末位+1
-16转换为二进制为:11111111 11111111 11111111 11110000(取补码)(在计算机系统中,数值一律用补码来表示和存储)
右移两位后 11111111 11111111 11111111 11111100(为补码,十进制-4
  • 数学意义:右移一位相当于除以2的一次方。右移n位相当于除以2的n次方。

>>>运算

无符号右移运算符:按二进制形式把操作数向右移动指定位数。**低位移出(丢弃)、高位的空位补零。

1
2
3
4
5
6
7
16 <<< 2
16转换为二进制为:00000000 00000000 00000000 00010000
无符号右移两位后 00000000 00000000 00000000 00000100(十进制4

-16 <<< 2
-16转换为二进制为:11111111 11111111 11111111 11110000(取补码)
右移两位后 00111111 11111111 11111111 11111100(高位的空位补0