二进制与进制转换
从我们上学起所接触到的正常的数学运算被称之为十进制,逢十进一。而我们的计算机的底层都是以二进制进行运算的。顾名思义,二进制则满足‘逢二进一’规则,它的基数是为2,以0和1为基石来表示数。由18世纪德国数理哲学大师莱布尼兹发现。
二进制表示
定义两个数子6,-6利用java自带的算法进行表示
输出结果:Java的二进制6:00000000 00000000 00000000 0110
Java的二进制-6:11111111 11111111 11111111 1010
具体的计算方式:
一般的int型以32位二进制表示 以0开头的表示为正 ,以1开头表示为负
上面的数子6,二进制的形式:0110
如:从右至左 第1位:0*2^0=0;
第2位:1*2^1=2;
第3位:1*2^2=4;
第4位:0*2^3=0;
结果相加:0+2+4+0=6;
这里介绍一个总要的算式:-n=~n+1, 负n=n的补码+1.这叫做互补对称原则。
由此可以得出-6的二进制表现形式。
二进制计算
~ 取反运算
& 与运算
| 或运算
>>> 逻辑右移位运算
>> 数学右移位运算
<< 左移位运算
& --与运算(逻辑乘法)
规则:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
| -- 或运算 (逻辑加法)
规则:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
>>> --逻辑右移位运算
每个位向右移位, 高位补0
例子:n = 00101011 10110111 10100101 11011010
m=n>>>1 = 000101011 10110111 10100101 1101101
k=n>>>2 = 0000101011 10110111 10100101 110110
<<-- 左移位运算
每个位向左移位, 低位补0
例子:
n = 00101011 10110111 10100101 11011010
m=n<<1 = 0101011 10110111 10100101 110110100
k=n<< 2 = 101011 10110111 10100101 1101101000
案例:
public class Demo08 {
public static void main(String[] args) {
/*
* 左移位的数学意义
*/
int n = 50;
int m = n<<1;
int k = n<<2;
System.out.println(m);
System.out.println(k);
Demo07.print(n);
Demo07.print(m);
Demo07.print(k);
/*
* 右移位的数学意义
*/
n = 50;
m = n>>1; //>>>
k = n>>2; //>>>
System.out.println(m);//25
System.out.println(k);//12
Demo07.print(n);
Demo07.print(m);
Demo07.print(k);
/*
* >>> >> 在正数情况下一样
* >>> >> 在负数情况下不同
* >> 负时候, 高位补1
* >>> 负时候, 高位补0
*
* n = 11111111 11111111 11111111 11001110 -50
* n>>1 111111111 11111111 11111111 1100111 -25
* n>>2 1111111111 11111111 11111111 110011 -13
* n>>>1 011111111 11111111 11111111 1100111
*
* 将 >> 称为数学移位计算(向小方向取整)
* 将 >>> 称为逻辑移位计算
*
*/
n = -50;
n = n>>1;
k = n>>>1;
System.out.println(n);
System.out.println(k);
}
}