Java运算符一
package frank; public class App { public static void main(String[] args) { System.out.println(2&5);//按位与 两个都为1的情况下才会取1,否则取0 /* 00000000000000000000000000000010 00000000000000000000000000000101 00000000000000000000000000000000 结果为 0 */ System.out.println(2|5);//按位或 只要有一个为1,那么就取1,否则为0 /* 00000000000000000000000000000010 00000000000000000000000000000101 00000000000000000000000000000111 结果为 7 */ System.out.println(2^5);//按位异或 相同得到0,不同得到1 /* 00000000000000000000000000000010 00000000000000000000000000000101 00000000000000000000000000000111 结果为 7 */ System.out.println(~-5);//按位非 二进制取反 结果为:4 /* 10000000000000000000000000000101 得到-5的二进制原码。符号位不变。正数的补码即原码,负数的补码是原码取反后加一符号位不变 11111111111111111111111111111010 取反 11111111111111111111111111111011 加一 得到 -5的补码 00000000000000000000000000000100 进行非运算。符号位一起。最高位为0,即正数,正数的补码就是原码。 */ System.out.println(~5); /* 00000000000000000000000000000101 5的补码 11111111111111111111111111111010 按位非 得到一个补码 11111111111111111111111111111001 +(-1)得到反码 10000000000000000000000000000110 取反得到原码 -6 */ System.out.println(-2&5); /* 11111111111111111111111111111110 00000000000000000000000000000101 00000000000000000000000000000100 4 */ System.out.println(5<<2); //左移运算符,多的截掉 /* 00000000000000000000000000000101 补码即原码本身 00000000000000000000000000010100 20 */ System.out.println(-5<<2); //左移运算符,多的截掉 /* 10000000000000000000000000000101 原码 11111111111111111111111111111010 反码 11111111111111111111111111111011 加一 得到补码 11111111111111111111111111101100 得到移位后的补码 11111111111111111111111111101011 得到反码 10000000000000000000000000010100 得到原码 -20 */ System.out.println(-5>>2); //右移运算符,多的截掉 左边填充的以符号位为准 /* 10000000000000000000000000000101 原码 11111111111111111111111111111010 反码 11111111111111111111111111111011 加1得到补码 11111111111111111111111111111110 移位后的补码 11111111111111111111111111111101 减一得到反码 10000000000000000000000000000010 取反得到原码 2 */ System.out.println(-5>>>2);//无符号移位 /* 00111111111111111111111111111110 */ } }
移位只针对原生整型,小于int类型原生类型的系统自动装换成int类型在移位,如果对于一个int类型的值移位大于等于32位的话,那么系统会自动对移位数字和32进行取模运算,得到的值才会是要移位的实际值,long类型的原理一样,只不过是和64进行取模运算。
int s= 32%32;值是0 System.out.println(s); System.out.println(Integer.MAX_VALUE>>32);等于下面的 System.out.println(Integer.MAX_VALUE>>0);
在两个数字进行运算的时候如果能使用扩展运算符的时候就尽量使用扩展运算符,因为代码更加健壮,性能更加好。
byte a = 5;
a = a + 5;//出错。类型不一样。
byte b = 5;
b+=5;不会报错。性能更好。