运算符你忘了吗
- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
在平时开发过程中,经常发现自己对于一些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=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 =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