为了阅读源码,和编写高效率的代码,进制间的转换和特殊运算符是我们必须要熟悉和掌握的。
一、制转转换
二进制的特点就是逢二进1,在我们学习数学的时候,我们一定记过加法表,或乘法表吧,想想加法乘法表的特性,我们可以发现进制间相互转换是很容易理解的,
下面我们对常用的进制转换进行说明。
十进制加法表:
十进制乘法表:
1.十进制二进制相互转换
二进制的特点是逢二进一,乘法就更加简单了:任何数乘以0都为0,任何数乘以1,结果都是这个数本身。
二进制加法表和乘法表:
示例:
十进制10+10运算:
将10转换为二进制:1010
我们使用公式来看 abcde转十进制:e*2^0 + d*2^1+ c*2^2+ b*2^3+ a*2^4,任何数的0次幂都等于1
得出结果为10100 转换为十进制:0 + 0 + 4 +0 +16=20
十进制10*11运算:
十进制转二进制就是使用当前数除以2,拿到余数,从下往上拼接,例如:11
从下往上拼接就是:1011 ,其实我们还可以通过128 64 32 16 8 4 2 1上面十进制转二进制公式进行反推:
8+2+1=11 对应上面就是 abcd d*2^0 + c*2^1+ b*2^2+ a*2^3 d=1 c=0 b=1 a=1
将11转为二进制:1011
2.八进制转十进制
八进制就是逢八进一
公式:ab a*8^1 + b*8^0
例如:12 1*8 + 2 = 10
3.十六进制转十进制
通过上述,我们知道十六进制就是十六进一,我们在java代码中可能会看到0x80 ,0x代表的就是16进制。
公式我们通过上述也可以推论出来:abcd (a*16^3) + (b*16^2) + (c*16^1) + (d*16^0)
例如:3f 3*16 + 15 = 63
二、特殊运算符
1、逻辑运算符
&运算符【将十进制转2进制 相同位都为1才是1 否则是0,计算出结果,将结果转换成10进制】
//将十进制转2进制(十进制转2进制公式)
// 5/2 余1 2/2 余0 1/2 余1 从后往前拼接 101
// 6/2 余0 3/2 余1 1/2 余1 从后往前拼接 110
// 7/2 余1 3/2 余1 1/2 余1 从后往前拼接 111
System.out.println(Integer.toBinaryString(99)); //1100011
System.out.println(Integer.toBinaryString(100));//1100100
System.out.println(Integer.toBinaryString(5));//101
System.out.println(100&99);//96
System.out.println(99&5);//1
//&运算符 将十进制转2进制 相同位都为1才是1 否则是0
//例如: 99[110 0011] 5[000 0101] 001 结果为1
// 十进制转十六进制
System.out.println(Integer.toHexString(9));
//十进制转八进制
System.out.println(Integer.toOctalString(9));
//十进制转二进制
System.out.println(Integer.toBinaryString(9));
//十六进制转十进制
System.out.println(Integer.valueOf("9",16));
//八进制转十进制
System.out.println(Integer.valueOf("11",8));
//二进制转十进制
System.out.println(Integer.valueOf("1001",2));
|运算符【将十进制转二进制 相同位只要有一个为1则为1 否则为0 结果转十进制】
int a = 2;//10
int b = 3;//11
System.out.println(a|b);//11 转十进制 3
~运算符【非运算符,转二进制 为0结果为1 为1结果为0】
System.out.println(~2);//01 -3
^运算符,同为假,异为真【异或运算符 将2个数转二进制 相同位结果相同位0,不同为1 结果转十进制 】
int a = 2;//10
int b = 3;//11
System.out.println(a^b);//01 转十进制 1
2、算术运算符
<<【左移运算符】低位补0 负数补1
int i = 5;//二进制101
i = i << 2; //10100
//正数右边第一位补0,负数补1,等于乘于2的n次方,十进制位是20
>> 【右移运算符】高位补0 负数补1
int i = 5;//二进制101
i = i >> 2; //1
//右移两位就是把101前面填充2个0,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1
>>>【无符号右移运算符】不管正、负 都在高位补0
int i = 5;//二进制101
i = i >>> 2; //1
//无符号右移是高位补0(从左到右 左为高位),移多少位补多少个0。
//负数无符号右移
//-5的二进制是5的二进制取反再加1(补码),5的二进制也就是0000 0000 0000 0000 0000 0000 0000 0101,取反后加1为1111 1111 1111 1111 1111 1111 1111 1011,右移三位0001 1111 1111 1111 1111 1111 1111 1111