提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
Java中提供了各种各样的运算符,如算术运算符:+、-、*、/表示加、减、乘、除四则运算,取模运算"%",以及其他自增、自减运算符等。本篇文章中要介绍的则是位运算符。
一、Java中的进制
在Java中,对于整数的表示有四种形式:
- 二进制:只用0,1表示,满2进1,以0b或者0B开头(进制符号中不区分大小写)。
- 十进制:用数字0-9表示,满10进1,也是最常见的表示形式。
- 八进制:用数字0-7表示,满8进1,以数字0开头(很容易混淆,不建议使用)。
- 十六进制:用数字0-9和字母A(10)-F(15)表示,满16进1,以0x或者0X开头。
public class BinaryDemo1 {
public static void main(String[] args) {
//二进制: 5
int num1 = 0b0101;
//十进制: 100
int num2 = 100;
//八进制:8
int num3 = 010;
//十六进制:10
int num4 = 0xA;
}
}
二、原码、反码、补码
2.1 原码
在计算机中,原码是对数字的二进制定点表示,数值的最高位是符号位:对于正数,该位是0;对于负数,该位是1。正数1和负数-1的原码示例如下。(Java中int整型数据长度为4个字节,每个字节为8个bit位,即32bit位)
原码是最简单的编码方式,便于输入输出。但是原码并不能直接参与运算,否则可能就会出现错误的计算结果。例如,1和-1求和是0,但是如果使用原码计算则计算结果并不是0,如下所示:
则该原码表示的计算结果为-2。
2.2 反码
上述已经说到原码并不能直接参与计算,真正参与计算的实际是补码(下一节将会介绍),反码通常是由原码转为补码的一种过渡码,其转换规则如下:
- 对于正数来说,原码、反码相同。
- 对于负数来说,符号位不变,其他位依次取反。
例如,求整数-1的反码如下:
2.3 补码
在计算机运算的时候,都是按补码的形式来运算。转换规则如下:
- 对于正数来说,原码、补码相同(正数的原码、反码、补码都是一样的)。
- 对于负数来说,补码=反码+1,反码=补码-1.
例如,求-1的补码如下:
在2.1节中展示了使用原码直接参与计算可能会出现计算结果异常,现在使用补码来求和1和-1(1是正数,补码和原码相同,-1的补码如上述所示),补码计算示例如下:
此时计算结果补码表示0,对于0来说,其原码、反码、补码都是0,故使用补码进行计算未出现计算结果异常(感觉这个例子有点特殊了,总而言之,计算机底层运算时使用补码进行计算,计算完成后再转为原码表示计算结果)。
三、位运算符
Java中没有无符号数,即Java中的数都是有符号的。在Java中,一共提供了7种位运算符,以下分别来介绍这些位运算符。
3.1 按位与
Java中,按位与的位运算符为"&",表示两位全为1时结果为1,否则为0。例如,计算2&3:
public class BinaryDemo2 {
public static void main(String[] args) {
int num1 = 2;
int num2 = 3;
//按位与运算
System.out.println("2 & 3 = " + (2 & 3));
}
}
上述已经说明,底层运算时都是使用补码计算,2&3补码运算如下:
3.2 按位或
在Java中,按位或的位运算符为"|",表示至少其中一个为1,结果为1,否则为0。计算2|3如下:
public class BinaryDemo2 {
public static void main(String[] args) {
int num1 = 2;
int num2 = 3;
//按位与运算
System.out.println("2 | 3 = " + (2 | 3));
}
}
补码运算如下:
3.3 按位取反
Java中按位取反的位运算符为"~",表示如果是1,结果是0,如果是0,结果为1。例如,整数2按位取反计算:
public class BinaryDemo2 {
public static void main(String[] args) {
int num1 = 2;
//按位与运算--> -3
System.out.println("~2 = " + (~2));
}
}
补码计算:
3.4 按位异或
Java中按位异或的位运算符为"^",表示其中一个为0,一个为1时结果为1,否则为0。例如,计算2异或3:
public class BinaryDemo2 {
public static void main(String[] args) {
int num1 = 2;
int num2 = 3;
//按位与运算
System.out.println("2 ^ 3 = " + (2 ^ 3));
}
}
3.5 算术右移
Java中算术右移的位运算符为">>",运算规则为低位溢出,符号位不变,并且使用符号位补溢出的高位。例如,4>>1计算如下:
public class BinaryDemo2 {
public static void main(String[] args) {
int num1 = 4;
int num2 = 1;
//按位与运算
System.out.println("4 >> 1 = " + (4 >> 1));
}
}
4>>2计算如下:
实际上,对于算术右移来说,右移n位即相当于数值除以2^n次方。4算术右移2位补码运算如下:
结果即为1。
3.6 算术左移
Java中算术左移的位运算符为"<<",计算规则为符号位不变,低位补0。例如计算1<<2如下:
计算1<<3如下:
跟算术右移相反,算术左移n位等于数值乘以2^n次方。1<<2补码运算如下:
3.7 逻辑右移
Java中逻辑右移的位运算符为">>>",逻辑右移也称为无符号右移,计算规则为低位溢出,高位补0。例如,计算3>>>2如下:
对应补码运算如下:
在Java中,没有逻辑左移的位运算符"<<<“。对于C/C++来说,不能保证”>>“是完成了算术移位即扩展符号位还是逻辑移位即填充0,即C/C++的”>>"运算符对于负数得到生成结果可能会依赖于具体实现,但是Java中则消除了这种不确定性。
总结
本次回顾的知识点主要是JavaSE中的位运算符相关的内容,这部分内容在工作中需要使用则适当使用即可,并不需要做过多的深入了解。(ps:突然发现写博客是一种非常不错的知识复习方式)