前言
Java运算符 &(与)、|(或)、^(异或)、~(非),本文先简单了解这些,学习运算符之前,我们先来熟悉一下 进制之间的换算。
1、十进制和二进制运算
十进制转换二进制
我们先来看一段代码:
public static void main(String[] args) {
String str = toBinary(10);
System.out.println(str);
}
static String toBinary(int num) {
String str = "";
while (num != 0) {
str = num % 2 + str;
num = num / 2;
}
return str;
}
运行结果:1010
原理:十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
例如10转二进制
- 第一次除以2等于5(余数为0)
- 第二次除以2等于2(余数为1),
- 第三次除以2等于1(余数为0),最后余数1,
得到的余数依次是0 1 0 1。
反过来就是1010,计算机内部表示数的字节长度是固定的,比如8位,16位,32位。所以在高位补齐,java中字节码是8位的,所以高位补齐就是00001010.
二进制转换十进制
原理:要从右到左用二进制的每个数去乘以2的相应次方
1010 = 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 0 + 2 + 0 + 8 = 10
所以总结起来通用公式为:
A(n...cba)=a(2^0)+b(2^1)+c(2^2)+...+n(2^[n-1])
2、&(与)
位与运算符,两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0
例如 8 & 11.
8转换二进制1000,11转换二进制1011,从高位开始比较,结果1000,转化十进制为8.
3、|(或)
位或运算符,两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0
例如 8 | 11.
8转换二进制1000,11转换二进制1011,从高位开始比较,结果1011,转化十进制为11.
4、^(异或)
位异或运算符,两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1
例如 8^ 11.
8转换二进制1000,11转换二进制1011,从高位开始比较,结果0011,转化十进制为3.
5、~(非)
位非运算符,如果位为0,结果是1,如果位为1,结果是0
例如 ~11.
11转换二进制1011,在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节。
补码后:00000000 00000000 00000000 00001011
取反为:11111111 11111111 11111111 11110100
因为高位为1,所以结果原码应为负数,负数的补码是其绝对值的原码取反,末尾在加1.
因此,我们需要对补码加1为:00000000 00000000 00000000 00001100
取反码:11111111 11111111 11111111 11110011
接下来,把上面结果取反得原码:
00000000 00000000 00000000 00001100 ,转化十进制为12
所以,~11 = -12