二进制

十进制 数字123
每一位的数字是0-9,10个数字中的一个
123 = 1x100 + 2x10 + 3x1
位权: 100 10 1

二进制 1010
每个位置只能是0和1,两个数字
位权: 8 4 2 1

补码:负整数的二进制表示
-1
1的原码: 00000001
取反: 11111110
+1: 11111111(补码)

对-1的补码进行补码运算,得到对应正数1的原码
-1的补码: 11111111
取反: 00000000
+1:00000001

为什么需要补码?
因为计算机只能做加法.
1-1对应的是 1+(-1)
00000001
11111111
00000000 结果等于0,最高位进1操作,超出位数限制,被丢弃

十六进制

int a = 0x7b;

Java 7之后二进制常量

int a = 0b11001;
// 打印二进制字符串
System.out.println(Integer.toBinaryString(a));
// 打印十六进制字符串
System.out.println(Integer.toHexString(a));

位运算
左移: <<, 右边补0, 左移1位相当于乘以2
无符号右移: >> 左边补0
有符号右移:左边最高位是1就补1,是0就补0
右移1位相当于除以2

小数为什么不能被二进制精确表示?
10进制 1.2 = 1x1 + 2x0.1
1/3 结果10进制也是不能精确表示的
理解二进制小数的位权
2^(-1) 0.5
2^(-2) 0.25
2^(-3) 0.125

小数转化为整数进行运算,运算结束后再转化为小数
BigDecimal 运算更精确,但效率比较低

// 查看浮点数的具体二进制形式
Integer.toBinaryString(Float.floatToIntBits(value));

你可能感兴趣的:(二进制)