day19-进制
1.二进制
-
逢二进一的计数规则
-
-
将一个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的计数规则
-
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位置对应的权值
-
-
互补对称:
-
公式:-n=~n+1 结论:一个数的补码=这个数取反+1
-
代码
int n = -3;
int m = ~n+1;
System.out.println(m); //3 -3的补码就是-3取
-
-
位运算:
-
~:取反(0变1、1变0)
-
&:与运算(有0则0)
-
|:或运算(有1则1)
-
“>>>”:右移位运算
-
<<:左移位运算
-