在java中的整数值有四种表示方式:
十六进制:以0x或者0X开头,其中10~15分别用a~f来表示(不区分大小写);
十进制:最常见的一种进制,只有0~9
八进制:以0开头,只有1~7
二进制:以0b或者0B开头,只有0、1
但是在计算机中,所有数字都是以二进制形式保存,最高位为符号位,1表示负数,0表示正数,且以补码的形式保存所有的整数,而原码是直接将一个数值换算成十进制数。补码的计算规则为:正数的补码、反码和原码完全相同,负数的补码是其反码加1;反码是指对原码按位取反,(最高位)符号位不变。
1、讨论位操作符之按位非(~)(将操作数上的每个位,包括符号位,全部取反)
举个例子:~5的结果 为:-6
public class Main {
public static void main(String[] args) {
int a = 5 ;
System.out.println(~a); //输出结果为-6
}
}
分析如下:
5的原码:00000000 00000000 00000000 00000101
5的补码:00000000 00000000 00000000 00000101
取反之后:
11111111 11111111 11111111 11111010 这是最终结果的原码 最高位为1 是一个负数 之前说过计算机中的数值以补码形式存在,而负数的补码为其反码加1,所以先求反码:
10000000 00000000 00000000 00000101 这是最终结果的反码 最高位为1 是一个负数
负数的补码是其反码加1:
10000000 00000000 00000000 00000110 这是最终结果的补码 转换为十进制 结果为-6
2、讨论位操作符之按位与(&)(当两位同时为1才返回1)
举个例子:
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 3;
System.out.println(5&3); //输出结果为 1
}
}
分析如下:
5的二进制数:00000000 00000000 00000000 00000101
3的二进制数:00000000 00000000 00000000 00000011
我们知道,按位与(&)要求两个操作数的两位同时为1才返回1,所以5&3结果的二进制码为:
00000000 00000000 00000000 00000001
将二进制码转为十进制,输出结果为1。
3、讨论位操作符之按位或(|)(只要有一位为1,就返回1)
举个例子:
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 3;
System.out.println(5|3); //输出结果为 7
}
}
分析如下:
5的二进制数:00000000 00000000 00000000 00000101
3的二进制数:00000000 00000000 00000000 00000011
我们知道,按位或(|)要求两个操作数只要有一位为1就返回1,所以5|3结果的二进制码为:
00000000 00000000 00000000 00000111
将二进制码转为十进制,输出结果为7。
4、讨论位操作符之按位异或(^)(当两位相同时返回0,不同时返回1)
举个例子:
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 3;
System.out.println(5^3); //输出结果为 6
}
}
分析如下:
5的二进制数:00000000 00000000 00000000 00000101
3的二进制数:00000000 00000000 00000000 00000011
我们知道,按位异或(^)要求两个操作数两位相同时返回0,不同时返回1,所以5^3结果的二进制码为:
00000000 00000000 00000000 00000110
将二进制码转为十进制,输出结果为6。
5、讨论位操作符之左移运算符(<<)(把操作数的二进制码整体左移指定位数,右边空出来的为用0补充,若左移超出最大位数直接截断)
举个例子:将操作数5左移3位
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 3;
System.out.println(a<<b); //输出结果为 40
}
}
5的二进制数:00000000 00000000 00000000 00000101
左移3位之后:00000000 00000000 00000000 00101000
将二进制码转为十进制,输出结果为40。
6、讨论位操作符之右移运算符(>>)(把操作数的二进制码整体右移指定位数)
举个例子:
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 3;
System.out.println(a>>b); //输出结果为 0
}
}
5的二进制数:00000000 00000000 00000000 00000101
右移3位之后:00000000 00000000 00000000 00000000
将二进制码转为十进制,输出结果为0。