位运算符
它是操做二进制位的。
&(与)
他是把运算的两个数分别转换成二进制,然后把二进制的每一位一一对应的进行逻辑与运算,然后在将二进制结果转换成十进制返回给我们。
System.out.println(6&3);
结果:2
分析:
6>>>110
3>>>011
做与运算。结果是010,转换成十进制,是2。
练习:取出二进制数的低4位数。
00000000-00000000-00000000-01010100
答:使用与运算,原数与一个后四位为1,其他全为0的数即可。
|(或)
他是把运算的两个数分别转换成二进制,然后把二进制的每一位一一对应的进行逻辑或运算,然后在将二进制结果转换成十进制返回给我们。
^(异或)
他是把运算的两个数分别转换成二进制,然后把二进制的每一位一一对应的进行异或运算,然后在将二进制结果转换成十进制返回给我们。
注意:一个操作数,连续两次异或同一个数,结果不变。
老师似乎说了可以用来加密文件。
练习:要求:交换两个变量值,不允许使用第三个变量。(a=3,b=5)
方法一:
int a = 3;
int b = 5;
a = a + b; //a == 8
b = a - b; // b == 8 - 5;
a = a - b; // a == 8 - 3;
缺点:如果长度超出数据类型范围,编译就会出错。
方法二:
int a=3;
int b=5;
a = a ^ b; //a == 3 ^ 5;
b = a ^ b; //b == (3 ^ 5) ^ 5;
a = a ^ b; //a=5;
~(取反)
把要取反的数转化成二进制,然后进行取反运算,在转回十进制。
移位运算符
也是位运算符的一种。
1,左移(<<)
计算机会先将操作数转换成二进制,然后把这个二进制整体向左移动n为,n是运算符右边的数,空位补零。
规律:左移后的数是这个操作数乘以2的n次方,n是移动的位数。
System.out.println(3<<1); //结果为6
//3 * 2(1) = 6;
System.out.println(3<<2); //结果为12
//3 * 2(2) = 12;
System.out.println(3<<3); //结果为24
//3 * 2(3) = 24;
2,右移(<<)
计算机会先将操作数转换成二进制,然后把这个二进制整体向右移动n为,n是运算符右边的数。
要注意这个数的正负性,如果是负数的话,右移后再首位补1,正数补0。
规律:左移后的数是这个操作数除以2的n次方,n是移动的位数。
System.out.println(3>>1); // 结果为1
//3 / 2(1) = 1;
System.out.println(3>>2); // 结果为0
//3 / 2(2) = 0;
System.out.println(3>>3); //结果为 0
//3 / 2(3) = 0;
3,无符号右移(>>>)
不管是否为正数负数,都是直接右移,补零(负数也补0)。
练习:最高效率的算出2*8的值。
答案:2<<3
三目运算符
格式:表达式?值1:值2
注意:通过三目运算符的刀的结果必须使用,如果不使用就必须用一个变量接受它。
int age = 16;
System.out.println(age > 18 ? "成年人" : "未成年人");
结果:未成年人