Java运算符

&(按位与运算符)

&(按位与)的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真)1&1=1 , 1&0=0 , 0&1=0 , 0&0=0

// 按位与
int i = 3 & 5;
System.out.println(i); // 1

3的二进制为0000 0011,5的二进制为0000 0101,那么就是011&101=001,最终值为0000 0001=1

|(按位或运算符)

|(按位或)和&(按位与)计算方式都是转换二进制再计算,不同的是运算规则(一个为真即为真)1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1

// 按位或
i = 3 | 5;
System.out.println(i); // 7

3的二进制为0000 0011,5的二进制为0000 0101,那么就是011 | 101=111,最终值为0000 0111=7

^(异或运算符)

(异或)运算符顾名思义,异就是不同,其运算规则为10 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0

// 异或
i = 3 ^ 5;
System.out.println(i); // 6

3的二进制为0000 0011,5的二进制为0000 0101,那么就是011 ^ 101=111,最终值为0000 0110=6

<<(左移运算符)

左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0

// 左移
i = 10 << 2;
System.out.println(i); // 40

10<<2的意思是10的二进制位往左移动2位,右边补0,10的二进制0000 1010,往左移动两位0010 1000=40

>>(右移运算符)

右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定

// 右移
i = 10 >> 2;
System.out.println(i); // 2

10>>2的意思是10的二进制位往右移动2位,左边补0,10的二进制0000 1010,往右移动两位0000 0010=2

~(取反运算符)

二进制每一位取反,0变1,1变0

// 取反
i = ~5;
System.out.println(i); // -6

5的补码0000 0101,补码取反1111 1010,符号位为1,属于负数,在计算其反码减1=1111 1001,在换算成原码1111 0110= -6

>>>(无符号右移运算符)

无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0,无符号右移运算只针对负数计算和只是对32位和64位的值有意义

// 无符号右移
i = -1 >>> 16;
System.out.println(i); // 65535

-1的二进制0000 0000 0000 0000 0000 0000 0001,取反后加1为1111 1111 1111 1111 1111 1111 1111,右移两位0000 0000 0000 0000 1111 1111 1111 1111

你可能感兴趣的:(Java运算符)