1、&是位运算符,&&是逻辑运算符。
位运算符有:~,&,|,^,>>,<<,>>>
逻辑运算符:&&,||,!
/**
* &&和&的区别:
* 1:相同之处:可以当作逻辑与的运算符,两边为true,整个结果才为true;否则为false。
* 2.&&具有短路功能,第一个表达式为false,则不再计算第二个表达式。
* &:不具有短路功能,第一个表达式为fals,有表达式还会计算。
* 3.&:可以当按位与进行操作。
*
*/
System.out.print("&&和&当逻辑与的相同和不同:");
String s = null ;
System.out.print(3>5&&!s.equals(""));
if(s!=null&!s.equals("")){
System.out.println("这里会报空指针异常。");
}
System.out.println();
System.out.println(3>5&&5<7);
System.out.println(3>5&5<7);
/**
* 逻辑运算符只针对boolean类型进行逻辑运算
* &&
* ||
* !
* A B A&&B A||B !A
* T T T T F
* T F F T F
* F T F T T
* F F F F T
*/
int a=10;
int b=20;
int c=a&b;
System.out.println("a和b的按位与是: "+c);
/**
* &:全1则为1,否则为0
* a:0000 1010
* b:0001 0100
* a&b:0000 0000
*/
int d=30;
System.out.println("30取反的值: "+~d);
/**
* ~:遇0则1,遇1则0。正数直接求值,负数取反加一添负号。
*
* d:30的二进制: 00000000 00000000 00000000 00011110
* ~d的二进制:d的二进制:遇0则1,遇1则0
* ~d:~d的二进制:11111111 11111111 11111111 11100001
* 求其值 负数求其值:取反加一 添负号
* 00000000 00000000 00000000 00011110
* 00000000 00000000 00000000 00011111
* 算:16+8+4+2+1=31
* 即为-31
*/
int e=-31;
System.out.println("-31取反的值:"+~e);
System.out.println(e>>2);
/**
* -31的二进制: 11111111 11111111 11111111 11100001
* 00000000 00000000 00000000 00011110
* 求其值 正数直接求:16+8+4+2=30
* 即为30
*/
int f=30;
System.out.print("f:正数(30)右移两位: ");
System.out.println(f>>2);
System.out.print("f:无符号右移:正数(30)右移两位: ");
System.out.println(f>>>2);
int g=-30;
System.out.print("g:负数(-30)右移两位: ");
System.out.println(g>>2);
System.out.print("g:无符号右移:负数(-30)右移两位: ");
System.out.println(g>>>2);
int h=30;
System.out.print("h:正数(30)左移两位: ");
System.out.println(h<<2);
int i=-30;
System.out.print("i:负数(-30)左移两位: ");
System.out.println(i<<2);
/**
* >>n: 向右移(分符号右移:正数:高位补0,低位舍去;负数:高位补1,低位舍去):数值/2的n次方 =取整(往小数取值)
* <<n : 向左移(不分符号左移:低位补0,高位舍去):数值*2的n次方
*
* >>>n:无符号向右移:(分符号右移:高位永远补0):正数:数值/2的n次方 =取整
* 负数变成很大的正数。
*/