二进制
1 什么是二进制
二进制:逢二进一的计数规则。
计算机底层 也就是 数据类型都是2进制的! int long float double 等 都是2进制的!
int 类型内部是 32位2进制数,8位称为1个字节,32位2进制数也称为4字节
long 类型内部是 64位2进制数,8位称为1个字节,64位2进制数也称为8字节
float double 内部采用 浮点数2进制表示 IEEE-754标准,今天不讨论
计算机内部为啥使用2进制:2进制的制造成本最低!
计算机如何处理10进制和2进制:
案例:
public class Demo01 { public static void main(String[] args) { /* * 1 Java内部一切数据都是2进制的! 如 int n 在内存中就是2进制 * */ int n = 50; //编译期间,将"50"转化为110010, 程序执行时候 n 就是110010 System.out.println(n); //输出时候 println 方法将 110010 转化为“50”输出 //Java 提供了输出数据2进制的功能,利用这个功能就可以显示数据的2进制,在内存中的情况 System.out.println(Integer.toBinaryString(n)); n = 51; System.out.println(Integer.toBinaryString(n)); for(int i=0; i<100; i++) { System.out.println(Integer.toBinaryString(i)); } /* 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000010 00000000 00000000 00000000 00000011 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000101 00000000 00000000 00000000 00000110 00000000 00000000 00000000 00000111 00000000 00000000 00000000 00001000 00000000 00000000 00000000 00001001 00000000 00000000 00000000 00001010 = 8+2 = 10 00000000 00000000 00000000 00001011 00000000 00000000 00000000 00001100 00000000 00000000 00000000 00001101 00000000 00000000 00000000 00001110 00000000 00000000 00000000 00001111 */ } }
2 什么是16进制
逢16进一的计数规则
进制直接量,书写冗长麻烦!计算机编程语言采用16进制作为2进制的缩写
缩写规则:2进制从最低位开始,每4位缩写为1位16进制数
案例:
public class Demo02 { public static void main(String[] args) { /* * Java 7 以后提供了2进制直接量语法,前缀0b开头的2进制直接量 * 2进制直接量,书写冗长麻烦! */ int n = 0b110010; //50 System.out.println(Integer.toBinaryString(n)); n = 0b1001111101000101010001001011111;// 2进制直接量,书写冗长麻烦! System.out.println(Integer.toBinaryString(n)); n = 0x4fa2a25f; //利用16进制缩写2进制,使用方便 System.out.println(Integer.toBinaryString(n)); n = 0b11001111101000101010001001011111; System.out.println(n); } }
3 补码
计算机中负数的编码。其目的是解决负数问题。
设计思想:将固定位数的2进制数分一半作为负数使用的一种编码。
基本运算规则:
固定位数,计算时候,超过固定位数就自动溢出舍弃,始终保持固定的位数
将高位为1的数作为负数使用
采用倒推的方式为负数编码
以4位数补码位例子研究补码。然后推广到32位(int)
案例
public class Demo03 { public static void main(String[] args) { /* * 验证int\long类型的补码编码 * */ int max = Integer.MAX_VALUE; int min = Integer.MIN_VALUE; System.out.println(max); System.out.println(min); System.out.println(Integer.toBinaryString(max)); System.out.println(Integer.toBinaryString(min)); long lmax = Long.MAX_VALUE; long lmin = Long.MIN_VALUE; System.out.println(Long.toBinaryString(lmax)); System.out.println(Long.toBinaryString(lmin)); int n = -1; System.out.println(Integer.toBinaryString(n)); long l = -1L; System.out.println(Long.toBinaryString(l)); System.out.println("如何认识负数:"); System.out.println(Integer.toBinaryString(n)); int m = -4; System.out.println(Integer.toBinaryString(m)); System.out.println(Integer.toBinaryString(-12)); System.out.println(Integer.toBinaryString(-44)); /* * 如何认识负数: 11111111111111111111111111111111 -1 11111111111111111111111111111100 -1-1-2 = -4 11111111111111111111111111110100 -1-1-2-8= -12 11111111111111111111111111010100 -1-1-2-8-32 = -44 11111111111111111111111111001111 -1-16-32 = -49 */ for(int i=-200; i<0; i++) { System.out.println(Integer.toBinaryString(i)); } } }