运算符你忘了吗

883 阅读4分钟

在平时开发过程中,经常发现自己对于一些java基本的运算符认识不够深入,难免对于一些细节之处有疏漏。问题虽小 ,但很可能因为小问题造成大事故,千里之堤溃于蝼蚁!

与(&)

  • &按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真)1&1=1 , 1&0=0 , 0&1=0 , 0&0=0(二进制运算)
int i = 80; //十进制
int j = 20; //十进制
String s = Integer.toBinaryString(i);//二进制
String s1 = Integer.toBinaryString(j);//二进制
System.out.printf(" 十进制数:%d  转成二进制后 %s \n", i, s);
System.out.printf(" 十进制数:%d  转成二进制后 %s \n", j, s1);
System.out.println(" 80 & 20 =  1010000 & 10100 =" +(80&20));
  1. 十进制数:80 转成二进制后 1010000
  2. 十进制数:20 转成二进制后 10100
  3. 80 & 20 = 1000 & 10100 =16

或(|)

  • | 按位或的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为假才为假,一个为真即为真) 1|1=1 , 1|0=1 , 0|1=1 , 0|0=0(二进制运算)
int i = 80; //十进制
int j = 20; //十进制
String s = Integer.toBinaryString(i);//二进制
String s1 = Integer.toBinaryString(j);//二进制

System.out.printf(" 十进制数:%d  转成二进制后 %s \n", i, s);
System.out.printf(" 十进制数:%d  转成二进制后 %s \n", j, s1);
System.out.println(" 80 | 20 =  1010000 | 10100 =" +(80|20));
  1. 十进制数:80 转成二进制后 1010000
  2. 十进制数:20 转成二进制后 10100
  3. 80 | 20 = 1000 & 10100 =84

异或(^)

  • ^异或运算符顾名思义,异就是不同,其运算规则为1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
int i = 80; //十进制
int j = 20; //十进制
String s = Integer.toBinaryString(i);//二进制
String s1 = Integer.toBinaryString(j);//二进制

System.out.printf(" 十进制数:%d  转成二进制后 %s \n", i, s);
System.out.printf(" 十进制数:%d  转成二进制后 %s \n", j, s1);
System.out.println(" 80 ^ 20 =  1010000 ^ 10100 =" +(80^20));
  1. 十进制数:80 转成二进制后 1010000
  2. 十进制数:20 转成二进制后 10100
  3. 80 ^ 20 = 1010000 ^ 10100 =68

取反(~)

  • 取反就是1为0,0为1
int i = 80; //十进制
String s = Integer.toBinaryString(i);//二进制
System.out.printf(" 十进制数:%d  转成二进制后 %s \n", i, s);
System.out.printf("%d 取反后为 %d \n", i, ~i);
  1. 十进制数:80 转成二进制后 1010000
  2. 80 取反后为 -81

取余(%)

  • 在java中,对于正整数,一个表达式的值除以另一个表达式的值,返回余数。 取模跟取余如果细说篇幅太长,本篇只是做一个抛砖引玉的讲述,欢迎大佬们在评论区补充相关
int i = 81; //十进制
int j = 20; //十进制
String s = Integer.toBinaryString(i);//二进制
String s1 = Integer.toBinaryString(j);//二进制
System.out.printf(" 十进制数:%d  转成二进制后 %s \n", i, s);
System.out.printf(" 十进制数:%d  转成二进制后 %s \n", j, s1);
System.out.printf(" %d %% %d =  %s %% %s =  %d \n", i, j, s, s1, (i% j));
  1. 十进制数:81 转成二进制后 1010001
  2. 十进制数:20 转成二进制后 10100
  3. 81 % 20 = 1010001 % 10100 = 1

左移(<<)

  • 二进制位往左挪两位,右边补0,比如: 5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位补0,负数补1,等于乘于2的n次方,十进制位是20
int i = 80; //十进制
String s = Integer.toBinaryString(i);//二进制
System.out.printf("%d 十进制转二进制后为 %s \n", i, s);
System.out.printf("%d 左移 << 2位后为 %d \n", i, i << 2);

80 十进制转二进制后为 1010000 80 左移 << 2位后为 320

带符号右移(>>)

二进制位往右挪两位,比如: 5的二进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1

int i = 80; //十进制
String s = Integer.toBinaryString(i);//二进制
System.out.printf("%d 十进制转二进制后为 %s \n", i, s);
System.out.printf("%d 带符号右移 >> 2位后为 %d \n", i, i >> 2);

80 十进制转二进制后为 1010000 80 带符号右移 >> 2位后为 20

无符号右移(>>>)

  • 无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。比如:15的二进制位是0000 1111 , 右移2位0000 0011,结果为3
int i = 80; //十进制
String s = Integer.toBinaryString(i);//二进制
System.out.printf("%d 十进制转二进制后为 %s \n", i, s);
System.out.printf("%d 无符号右移 >>> 2位后为 %d \n", i, i >>> 2);

80 十进制转二进制后为 1010000 80 无符号右移 >>> 2位后为 20