1.算数操作符:
+(加) -(减) *(乘) /(除于)
public class HelloWorld { public static void main(String[] args) { int i = 10; int j = 5; int a = i + j; int b = i - j; int c = i * j; int d = i / j; } }
%(取模)
取余数,又叫取模
public class HelloWorld { public static void main(String[] args) { int i = 5; int j = 2; System.out.println(i % j); // 5除以2,余1,输出为1 } }
++(自增) --(自减)
在原来的基础上增加1或者减少1
public class HelloWorld { public static void main(String[] args) { int i = 5; System.out.println(i++); // 输出5 System.out.println(i); // 输出6 int j = 5; System.out.println(++j); // 输出6 System.out.println(j); // 输出6 int m = 5; System.out.println(m--); // 输出5 System.out.println(m); // 输出4 int n = 5; System.out.println(--n); // 输出4 System.out.println(n); // 输出4 } }
public class HelloWorld { public static void main(String[] args) { int i = 1; int j = ++i + i++ + ++i + ++i + i++; System.out.println(i); System.out.println(j); // 第一步: ++i=2, i=2,j=2; // 第二步: i++=2, j=4,i=3; // 第三步: ++i=4, i=4,j=8; // 第四步: ++i=5, i=5,j=13; // 第五步: i++=5, j=18,i=6; } }
2.关系操作符
比较两个变量之间的关系。
>(大于) >=(大于或等于) < (小于) <=(小于或等于) ==(是否相等) !=(是否不等)
public class HelloWorld { public static void main(String[] args) { int a = 5; int b = 6; int c = 5; System.out.println(a > b); // 返回 false System.out.println(a >= c); // 返回 true System.out.println(a == b); // 返回false System.out.println(a != b);// 返回true } }
3.逻辑运算符
&长路与 和 &&短路与
两边的运算单元都是布尔值,都为真时,才为真,任意为假,就为假;
长路与 两侧,都会被运算,短路与 只要第一个是false,第二个就不进行运算了。
public class HelloWorld { public static void main(String[] args) { // 长路与 无论第一个表达式的值是true或者false,第二个的值,都会被运算 int i = 2; System.out.println(i == 1 & i++ == 2); // 无论如何i++都会被执行,所以i的值变成了3 System.out.println(i); // 短路与 只要第一个表达式的值是false的,第二个表达式的值,就不需要进行运算了 int j = 2; System.out.println(j == 1 && j++ == 2); // 因为j==1返回false,所以右边的j++就没有执行了,所以j的值,还是2 System.out.println(j); } }
|长路或 和 ||短路或
两边的运算单元都是布尔值,都为假时,才为假,任意为真,就为真;
长路或 两侧都会被运算,短路或 只要第一个是true的,第二个就不进行运算了。
public class HelloWorld { public static void main(String[] args) { // 长路或 无论第一个表达式的值是true或者false,第二个的值,都会被运算 int i = 2; System.out.println(i == 1 | i++ == 2); // 无论如何i++都会被执行,所以i的值变成了3 System.out.println(i); // 短路或 只要第一个表达式的值是true的,第二个表达式的值,就不需要进行运算了 int j = 2; System.out.println(j == 2 || j++ == 2); // 因为j==2返回true,所以右边的j++就没有执行了,所以j的值,还是2 System.out.println(j); } }
!取反
真变为假;假变为真
public class HelloWorld { public static void main(String[] args) { boolean b = true; System.out.println(b); // 输出true System.out.println(!b);// 输出false } }
^异或
不同,返回真;相同,返回假
public class HelloWorld { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println(a ^ b); // 不同返回真 System.out.println(a ^ !b); // 相同返回假 } }
public class HelloWorld { public static void main(String[] args) { int a = 4, b = 5; System.out.printf("交换前:a = %d, b = %d ", a, b); a = a ^ b; b = a ^ b; a = a ^ b; System.out.printf("交换后:a = %d, b = %d ", a, b); } }
public class HelloWorld { public static void main(String[] args) { int i = 1; boolean b = !(i++ == 3) ^ (i++ == 2) && (i++ == 3); System.out.println(b); System.out.println(i); // 开始 i = 1; // !(i ++ == 3) 结果为true,i = 2 // (i ++ == 2)结果为true,i = 3 // 此时 !(i ++ == 3) ^ (i ++ == 2) 结果为 false // 再执行短与操作,整个表达式结果为 false // 注意:(i ++ == 3)表达式未执行 } }
4.位操作符
一个整数的二进制表达
public class HelloWorld { public static void main(String[] args) { int i = 5; String b = (Integer.toBinaryString(i)); // 5的二进制的表达101 System.out.println(i + " 的二进制表达是: " + b); } }
|位或
有1,则为1
public class HelloWorld { public static void main(String[] args) { int i = 5; int j = 6; System.out.println(Integer.toBinaryString(i)); // 5的二进制是101 System.out.println(Integer.toBinaryString(j)); // 6的二进制是110 System.out.println(i | j); // 所以 5|6 对每一位进行或运算,得到 111->7 } }
&位与
全为1,则为1
public class HelloWorld { public static void main(String[] args) { int i = 5; int j = 6; System.out.println(Integer.toBinaryString(i)); // 5的二进制是101 System.out.println(Integer.toBinaryString(j)); // 6的二进制是110 System.out.println(i & j); // 所以 5&6 对每一位进行与运算,得到 100->4 } }
^异或
不同则为1
任何数和自己进行异或 都等于 0;任何数和0 进行异或 都等于自己
public class HelloWorld { public static void main(String[] args) { int i = 5; int j = 6; System.out.println(Integer.toBinaryString(i)); // 5的二进制是101 System.out.println(Integer.toBinaryString(j)); // 6的二进制是110 System.out.println(i ^ j); // 所以 5^6 对每一位进行或运算,得到 011->3 System.out.println(i ^ 0); System.out.println(i ^ i); } }
~取非
1变0;0变1
取反
public class HelloWorld { public static void main(String[] args) { byte i = 5; System.out.println(Integer.toBinaryString(i)); // 5的二进制是00000101 System.out.println(~i); // 取非即为11111010,即为-6 } }
<<左移 >>右移
左移:根据一个整数的二进制表达,将其每一位都向左移动,最右边一位补0
右移:根据一个整数的二进制表达,将其每一位都向右移动
public class HelloWorld { public static void main(String[] args) { byte i = 6; System.out.println(Integer.toBinaryString(i));// 6的二进制是110 System.out.println(i << 1);// 6向左移1位后,变成1100,对应的十进制是12 System.out.println(i >> 1);// 6向右移1位后,变成11,对应的十进制是3 } }
>>>带符号右移与无符号右移
带符号右移 >>
对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0
对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1
无符号右移>>>
如果是一个负数,那么对应的二进制的第一位是1
无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0
这样就会使得负数在无符号右移后,得到一个正数
简单的说:
带符号右移 >> 移动后正的还是正的,负的还是负的,符号不变
无符号右移>>>移动后,变正的了
public class HelloWorld { public static void main(String[] args) { int i = -10; // -10的二进制是11111111111111111111111111110110 // 第一位是1,即符号位,代表这是一个负数 System.out.println(Integer.toBinaryString(i)); // 对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0 // 对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1 // -10带符号右移1位,移动后前面补齐1 // 得到11111111111111111111111111111011 // 因为第一位是1,所以依然是一个负数,对应的十进制是-5 int j = i >> 1; System.out.println(Integer.toBinaryString(j)); System.out.println(j); // -10无符号向右移1位,符号位也会向右移,第一位就变成了0 // 得到01111111111111111111111111111011,对应的十进制是2147483643 int k = i >>> 1; System.out.println(Integer.toBinaryString(k)); System.out.println(k); } }
5.赋值操作
= += -= *= /= %= &= |= ^= <<= >>= >>>=
public class HelloWorld { public static void main(String[] args) { int i = 3; i += 2; System.out.println(i); int j = 3; j = j + 2; System.out.println(j); int k = 3; k += ++k; System.out.println(k); } }
6.三元操作符
?:
表达式?值1:值2
如果表达式为真 返回值1;如果表达式为假 返回值2。
import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { System.out.println("今天是礼拜几?"); Scanner sc = new Scanner(System.in); int x = sc.nextInt(); String day = (x == 1) ? "礼拜一" : (x == 2 ? "礼拜二" : (x == 3 ? "礼拜三" : (x == 4 ? "礼拜四" : (x == 5 ? "礼拜五" : (x == 6 ? "礼拜六" : (x == 7 ? "礼拜天" : "输入错误!")))))); System.out.println("今天是:" + day); } }
7.计算机算术原理
原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.。
5的二进制为 0000 0101
(原码为0000 0101,反码为0000 0101,补码为0000 0101)
-5的二进制应该用补码表示,应该为1111 1011(取反加1)
(原码为1000 0101,反码为1111 1010,补码为1111 1011)
1.加法
0000 0101 5
+ 0000 0001 1
-------------------------
0000 0110 6
2.减法
0000 0001 1
- 0000 0101 5
-------------------------
1111 1100 -4(无符号4(0000 0100)->取反(1111 1011)->加一(1111 1100))
3.乘法
对负数进行左移:符号位始终为1,其他位左移
对正数进行左移:所有位左移,即 <<,可能会变成负数
对负数进行右移:取绝对值,然后右移,再取相反数
对正数进行右移:所有位右移,即 >>
实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:
a=a*9
分析a*9可以拆分成a*(8+1)即a*8+a*1, 因此可以改为: a=(a<<3)+a
a=a*7
分析a*7可以拆分成a*(8-1)即a*8-a*1, 因此可以改为: a=(a<<3)-a
关于除法可以类推,
public class HelloWorld { public static void main(String[] args) { int i = 18; int j = i * 9;// =i*8+i*1 System.out.println(j); System.out.println((i << 3) + i); } }