二进制
- 计算机有两种基础状态, 0和1也就是二进制, 表示的是开关. 因为中央处理器(CPU)和基本所有的电子元件也都只识别0和1
- 计算机最小的存储单位是字节(byte), 一个字节有8个二进制位(bit), 可以存储十进制数范围是无符号时0255和有符号时-128127
运算
加运算(进位规则是逢2进1): 0+0=0, 0+1=1, 1+0=1, 1+1=10
减运算(降位规则是从高位借1当2): 1-1=0, 1-0=1, 0-0=0, 0-1=1
乘运算(只在同时为1时结果才为1): 0×0=0, 0×1=0, 1×0=0, 1×1=1
除运算: 0÷1=0, 1÷1=1
例:
10100 # 当0-1时由于是逢2进1的, 所以从高位借1当2, 因此2-1所以1
-1010
-----
+1010
10100
-----
11110
二进制转八进制
二进制数 | 八进制数 |
---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
- 即从二进制的小数点为分界点, 向左或右按每三位分组, 注: 位数不够补零, 零只能补在最左或最右 例: 1011.11 -> 001 011 . 110 -> 13.6
二进制转十进制
- 每个位的数值单独转换后将所有的结果求和. 例: 1011= 1×2^3 + 0×2^2 + 1×2^1 + 1×2^0(=1) =11, 1010= 1×2^3 + 0×2^2 + 1×2^1 + 0×2^0(=0) =10
二进制转十六进制
二进制数 | 十六进制数 |
---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
- 每四位分组, 位数不够补零 例: 101101= 0010 1101 =0x2D
原码, 反码, 补码
- 所有数字在计算机底层都以二进制形式存在
- 计算机以补码的形式保存所有的整树
- 正数的原码, 反码, 补码都相同
- 负数的补码是其反码加1
- 原码: 直接将一个数值换成二进制数
- 反码: 是对原码按位取反, 只是最高位(符号位)确定为1
- Java整数常量默认是int类型, 当用二进制定义整数时, 其第32位是符号为; 当是long类型时, 二进制默认占64位, 第64位是符号位
0 000 1101 = 13; 正数时原码, 反码, 补码都是这个
1 000 1101 = -13;负数的原码
1 111 0010 = -13;负数的反码, 除符号位外取反
1 111 0011 = -13;负数的补码, 是反码的基础上+1
注意: 不管是正数还是负数都是按补码的形式存到 byte的, 只不过正数是(原码, 反码, 补码)都相同
负数15(-15)存到 byte, 计算机会自动转为补码 11110001
1 111 0001: 这个肯定就是负数的补码, 因为首位是1
1 111 0001 减1(- 1) 补码改成反码 1 111 0000
1 111 0000 取反将反码改成原码 1 000 1111 = -15
1 000 8 4 2 1 = -15
byte字节能存的正数最大值为127:
0 111 1111 = 127
0 64+32+16+8+4+2+1+0 = 127
-127的补码:
0 111 1111 = 127 反码 1 000 0000
1 000 0000 补码+1 = 1 000 0001 = -127
-128的补码:
以 1 000 0001(-127)的基础上 -1
1 000 0000 = -128
二进制特性
- 指定二进制数的低端n位都是零, 这个数可以被2^n整除也就是不会有余数. 例: 24(11000)÷4(2^2)=6
- 指定二进制数的第零位(最右)数是1时, 对应十进制数是奇数; 否则是偶数. 例: 1111=15, 110=6
- 指定二进制数的第n位是1, 而其它位全是0时, 这个数等于2^n. 例: 4(100)=4(2^2), 2(10)=2(2^1)
- 指定二进制数的第零位到第n位(不包含n位)全是一, 而其它位全是0, 这个数等于2^n-1. 例: 7(111)=7(2^3-1), 3(11)=3(2^2-1)
- 指定二进制数的所有位左移一位, 结果是对应十进制数的乘以2. 例: 11=3 -> 110=6, 111=7 -> 1110=14
- 指定二进制(只适用无符号)数的所有位右移一位, 结果是对应十进制数的除以2, 余数会被舍弃. 例: 111=7 -> 11=3, 110=6 -> 11=3
- 当两个n位二进制数相乘, 结果位到2×n. 例: 111100=11100 -> 22=4(5个位)
- 当两个n位二进制数相加或相减时, 结果位肯定不会多于n+1位. 例: 111-100=11 -> 2+1=3(4个位), 111+111=1110 -> 2+1=3(4个位)
- n个位二进制可以表示2^n个不同的组合. 例: 10: 4个(2^2) -> [10|01|11|00], 1: 2(2^1) -> [1|0]
- 十进制数2^n-1(n个位), 转二进制后全是1. 例: 11=3(2^2-1), 111=7(2^3-1)
- 已限定位长度(个数限定)的无符号二进制, 当最大数值时再加1结果将是0, 因为位溢出. 例: 1+1=0, 11+1=00, 111+1=000
- 已限定位长度(个数限定)的无符号二进制, 当值为0时减一结果将是最大数. 例: 0-1=1, 00-1=11, 000-1=111
- 已限定位长度(个数限定)的有符号二进制, 所有位取反, 再将结果减1, 最终结果是对应十进制数的取反
八进制
八进制转十进制
- 每个位的数值单独转换后将所有的结果求和. 例: 0172= 1×8^2 + 7×8^1 + 2×8^0(=2) =122
十进制
- 这是我们日常用的数, 10个基数[0-9], 进位规则是逢10进1
十进制转二进制
- 指定十进制数除以2后能除净是0否者是1将此数记录下来, 依次再用结果继续除, 直到剩余值小于2;最后把记录下来的二进制结果翻转过来就是实际二进制了. 例: 22= 0(22/2), 1(11/2), 1(5/2), 0(2/2), 1(1/2) =10110(翻转后)
十六进制
- 由16个基数组成[0-9a-f], 进位规则是逢16进1
十六进制转十进制
- 每个位的数值单独转换后将所有的结果求和. 例: 0x2A9F= 2×16^3 + 10×16^2 + 9×16^1 + 15×16^0(=15) =10911
进制间区分
- 末尾可以加字母区分 如二进制是B, 八进制是Q, 十进制是D, 十六进制是H 例: 二进制1010B
- 加前缀区分 如八进制以0开头, 与十进制区分 例: 0172. 十六进制是以0X或0x开头
进制位权: 各位上的数值大小是由位权来决定的. 位权是一个乘方值, 如二进制[…22,21,20,2-1,2^-2…], 十进制[…102,101,100,10-1,10^-2…] 例: 十进制234中2的位权是10(2), 3的位权是10(1), 4的位权是10(0).
Java基本数据类型
数值类型
基本类型 | 字节数 | 位数 | 无符号值范围 | 有符号值范围 |
---|
byte | 1byte | 8bits | 0 ~ 255(2^8) | -128(-2^7) ~ 127(2^7-1 |
short | 2bytes | 16bits | 0 ~ 65535(2^16) | -32768(-2^15) ~ 32767(2^15-1) |
int | 4bytes | 32bits | 0 ~ 4294967295(2^32) | -2147483648(-2^31) ~ 2147483647(2^31-1) |
long | 8bytes | 64bits | 0 ~ 18446744073709551615(2^64) | -9223372036854775808(-2^63) ~ 9223372036854775807(2^63-1) |
浮点类型
- Java的浮点数是采用了 IEEE 754标准(二进制浮点数算术标准)
基本类型 | 字节数 | 位数 | 值范围 |
---|
float | 4bytes | 32bits | 尾数(mantissa)最多精确到7位小数, 取决于指数(exponent)的长度 |
double | 8bytes | 64bits | 尾数最多精确到16位小数, 取决于指数的长度 |
布尔类型
- boolean类型没有精确大小, 单个 boolean类型的变量在编译时是按 int类型编译的也就是4个字节, 但如果是 boolean类型的数组, 每个数组元素按1个字节编译的
字符& 字符串类型
- GB2312字符集编码能表示6763个汉字, 715个符号, 共7478个
- GBK字符集编码能表示21003个汉字, 883个图形符号, 共21886个
- UTF-8编码的汉子范围是[\u4e00-\u9fa5]& [\u2E80-\u9FFF], 未提供准确个数
- char使用 UTF-8编码格式时 ASCII字符是1个字节, 中文是3个字节
- char使用 GBK| GB2312编码格式时 ASCII字符是2个字节, 中文是2个字节
- String使用 UTF-8编码格式时 ASCII字符是1个字节, 中文是3个字节
- String使用 GBK| GB2312编码格式时 ASCII字符是1个字节, 中文是2个字节, 但全角字符的话是2个字节
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!