转载博客地址link
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运算符。
与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为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。
或运算符
或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为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。
非运算符
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0。例如下面的程序段:
public class data15 {
public static void main(String[] args) {
int a = 2;
System.out.println("a 非的结果是:" + (~a));
}
}
运行结果
非a的结果是:-3
在计算机内部,有符号数有三种表示法:原码、反码和补码。
原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制
[+1]原 = 0000 0001
[-1]原 = 1000 0001
因为第一位是符号位, 所以若是8位二进制数,其取值范围就是:
[1111 1111 , 0111 1111]
即[-127 , 127]
原码是人脑最容易理解和计算的表示方式。
反码
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
[+1] = [ 00000001 ]原码 = [ 00000001 ]反码;
[-1] = [ 10000001 ]原码 = [ 11111110 ]反码;
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算
补码
补码是计算机中用来表示负数,使得负数能够使用加法器参与加法运算的一种码。
正数的补码即为自己,负数的补码为符号位不变,其余逐位求反再加1。
下面分析这个程序段:
“a”的值是2,转换成二进制就是00000010,非运算符运算后就是11111101。
异或运算符
异或运算符是用符号“^”表示的,其运算规律如下:
两个操作数的位中,相同则结果为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。
菜鸟教程讲解的蛮详细:链接地址link