逻辑运算符
@Test
public void testLogic() {
// && 逻辑与 (短路) 对于a&&b 当a为false时,不需要判断b是否为false
System.err.println(false && true); // false
System.err.println(false && false); // false
System.err.println(true && true); // true
System.err.println();
// || 逻辑或(短路) 对于a||b 当b为true时,不需要判断b是否为true
System.err.println(false || true); // true
System.err.println(true || true); // true
System.err.println(false || false); // false
System.err.println();
// !逻辑非
System.err.println(!true); // false
System.err.println(!false); // true
System.err.println();
// ^ 逻辑异或 (相同为false,不同为true)
System.err.println(false ^ true); // true
System.err.println(true ^ true); // false
System.err.println(false ^ false); // false
System.err.println();
// & 逻辑与(不短路) 对于a&b 当a为false时,仍需要判断b是否为false
System.err.println(false & true); // false
System.err.println(true & true); // true
System.err.println(false & false); // false
System.err.println();
// | 逻辑或(不短路) 对于a|b 当a为true时,仍然需要判断b是否为true
System.err.println(false | true); // true
System.err.println(true & true); // true
System.err.println(false & false); // false
System.err.println();
}
位运算符
位运算符共有7个,分别是:位与(&)、位或(|)、位非(~)、位异或(^)、右移(>>)、左移(<<)、0填充的右移(>>>)。
@Test
public void testBit() {
// 位与(&) 和逻辑与类似
System.err.println(1 & 0); // 0
System.err.println(1 & 1);// 1
System.err.println(0 & 0);// 0
System.err.println();
// 位或(|)和逻辑或类似
System.err.println(1 | 0);// 1
System.err.println(1 | 1);// 1
System.err.println(0 | 0);// 0
System.err.println();
// 位非(~)
System.err.println(~0); // -1
System.err.println(~1);// -2
System.err.println();
// 位异或(^) 相同为0,不同为1
System.err.println(1 ^ 0);// 1
System.err.println(1 ^ 1);// 0
System.err.println(0 ^ 1);// 1
System.err.println();
// 右移(>>)右移数值变小,每移动一位数值减半
System.err.println(2 >> 1);// 1
System.err.println(2 >> 2);// 0
System.err.println(8 >> 1);// 4
System.err.println(8 >> 2);// 2
System.err.println();
// 左移(<<)左移数值变大,每移一位数值增倍
System.err.println(2 << 1);// 4
System.err.println(2 << 2);// 8
System.err.println(8 << 1);// 16
System.err.println(8 << 2);// 32
System.err.println();
// 0填充的右移(>>>)无符号,右边空出的位以0填充
System.err.println(8>>>2);//2
System.err.println(-14 >>> 2); //1073741820
/*(即二进制的 11111111 11111111 11111111 11110010),
向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)*/
System.err.println();
}
下面摘自另一博客:
位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。
位运算符共有7个,分别是:位与(&)、位或(|)、位非(~)、位异或(^)、右移(>>)、左移(<<)、0填充的右移,也叫无符号右移(>>>)。从表面上看似乎有点像逻辑运算符
但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运算符。
1.位与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。
public class data13
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 与的结果是:"+(a&b));
}
}
运行结果
a 和b 与的结果是:128
下面分析这个程序:
“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。
2.位或运算符
或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为1,那么结果就是1,否则就为0,下面看一个简单的例子。
public class data14
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 或的结果是:"+(a|b));
}
}
运行结果
a 和b 或的结果是:129
下面分析这个程序段:
a 的值是129,转换成二进制就是10000001,而b 的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即129。
3.位非运算符
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0,下面看一个简单例子。
public class data15
{
public static void main(String[] args)
{
int a=2;
System.out.println("a 非的结果是:"+(~a));
}
}
4.位异或运算符
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个简单的例子。
public class data16
{
public static void main(String[] args)
{
int a=15;
int b=2;
System.out.println("a 与 b 异或的结果是:"+(a^b));
}
}
运行结果
a 与 b 异或的结果是:13
分析上面的程序段:a 的值是15,转换成二进制为1111,而b 的值是2,转换成二进制为0010,根据异或的运算规律,可以得出其结果为1101 即13。