Java基础知识IV
进制
1.二进制
什么是2进制
逢二进一的计数规则
如何将2进制转换为10进制?
将一个2进制数每个1位置的权值累加即可
Java 所有的变量\常量存储的都是2进制数!
public class Demo01 {
public static void main(String[] args) {
/*
1.java在编译期间将10进制数编译为2进制数,按2进制来运算
.java(50) 编译后 .class(110010)
2.Integer.toBinaryString()可以将底层的2进制数显示出来
3.int类型是32位2进制数,显示2进制数时自动省略高位0
4.System.out.println()将2进制转换为10进制输出
*/
int n = 50; //110010
System.out.println(Integer.toBinaryString(n)); //2进制
n++; //110011
System.out.println(n); //10进制
System.out.println(Integer.toBinaryString(n)); //2进制
}
}
2.十六进制
什么是16进制
逢16进1的计数规则
因为2进制的书写太繁琐麻烦
00000000 00000000 00000000 00110010
1
所以常常用16进制来缩写2进制数字
怎么缩写:将2进制从最低位开始,每4位2进制缩写为1位16进制
public class Demo02 {
public static void main(String[] args) {
/*
16进制:缩写2进制
1)0x是16进制字面量前缀,0x开头则编译器按照16进制编译
2)Java 7提供了2进制字面量前缀 0b----不用,一般都用16进制
*/
int n = 0x4f057afe; //0x表示16进制
int m = 0b1001111000001010111101011111110; //0b表示二进制
System.out.println(Integer.toBinaryString(n)); //按2进制输出
System.out.println(Integer.toBinaryString(m)); //按2进制输出
//结论:用16进制来表示2进制更方便
/*
8进制:
1)逢8进1的计数规则
2)前缀0表示为8进制
3)数字:0,1,2,3,4,5,6,7,没有7以上的数字
*/
//----小面试题(8进制平时不用)
//权 64 8 1
int x = 067; //0开头表示8进制
System.out.println(x); //十进制的55(6个8加上7个1)
}
}
3.补码
计算机中处理有符号数(正负数)的一种编码方式,java中的补码最小类型是int,32位数
以4位2进制为例讲解补码的编码规则:
计算的时候如果超出4位数就自动溢出舍弃,保持4位数不变
将4位2进制数分一半作为负数使用
最高位称为符号位,高位为1是负数,高位为0是正数
int n = -3;
System.out.println(Integer.toBinaryString(n));
/*
规律数:
1)0111为4位补码的最大值,规律是1个0和3个1,可以推导出:
32位补码的最大值,是1个0和31个1-----(011111111...)
2)1000为4位补码的最小值,规律是1个1和3个0,可以推导出:
32位补码的最小值,是1个1和31个0-----(100000000...)
3)1111为4位补码的-1,规律是4个1,可以推导出:
32位补码的-1是,是32个1------------(11111111...)
*/
int max = 2147483647; //int的最大值
int min = -2147483648; //int的最小值
System.out.println(Integer.toBinaryString(max)); //011111...
System.out.println(Integer.toBinaryString(min)); //100000...
System.out.println(Integer.toBinaryString(-1)); //11111...
深入理解负值:
记住-1的编码是32个1
用-1减去0位置对应的权值
11111111111111111111111111111111 = -1
11111111111111111111111111111101 = -1-2 = -3
11111111111111111111111111111001 = -1-2-4 = -7
11111111111111111111111110010111 = -1-8-32-64 = -105
互补对称:
公式:-n=~n+1 结论:一个数的补码=这个数取反+1
举例说明:
int n = -3;
int m = ~n+1;
System.out.println(m); //3 -3的补码就是-3取反+1
4.位运算
~ 取反
& 与运算
| 或运算
运算符:>>> 右移位运算
运算符:<< 左移位运算
& 与运算
基本规则:有0则0
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
运算的时候将两个数字对齐,将对应位进行与运算
| 或运算
基本规则:有1则1
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
运算符:>>> 右移位运算
基本规则:将2进制数整体向右移动,低位自动溢出舍弃,高位补0
<<左移位运算
基本规则:将2进制数整体向左移,高位溢出舍弃,低位补0