数据类型
Java数据类型分为基本数据类型和引用类型。基本类型分为数值类型和boolean类型,数值类型又包含整型和浮点型;引用(指针)类型分为类、接口和数组类型、null类型。
Java数据类型转换
- 基本类型的自动类型转换和强制转换
- 表达式类型的自动提升
进制转换
- 二进制
二进制位简称“位”,一个二进制位包含的信息量称为一比特。二进制的最高位为符号位,1代表负数,0代表正数,其余位表示数的绝对值。 - 二进制和十进制转换
- 二进制每位对应的十进制位2的n-1次方,如111对应2的平方,2的1次方,2的0次方,从右往左依次为1-2-4-8-16-32---
- 二进制转十进制:每位乘2的n-1次方,之后相加。如:10101的十进制为116+08+14+02+1*1=21
- 十进制转二进制:除了除二取余逆序排序外,还有一个方法是凑数,找到比该数小而近的2的幂,对应位为1,依次做差。
如:50最近的为32,即2的5次方,先写100000第六位为1;50-32=18,最近为16,即2的四次方,则第五位填1为110000;18-16=2,对应2的一次方,第二位填1,即110010
原码、反码、补码
- 原码:正数的原码为转换为二进制,并补齐位。负数的原码为按照绝对值转换为二进制后,最高为变成1。
如:7的原码为00000000 00000000 00000000 00000111,-7的原码为10000000 00000000 00000000 00000111 - 反码:正数的反码和原码相同。负数的反码为原码除最高位外按位取反。
如:7的反码为00000000 00000000 00000000 00000111,-7的反码为11111111 11111111 11111111 11111000 - 补码:正数的补码和原码相同。负数的补码为反码加1,即原码除最高位外按位取反加1。
如:7的补码为00000000 00000000 00000000 00000111,-7的补码为11111111 11111111 11111111 11111001 - 数值在计算机中是以补码的方式存储的,原因在于,使用补码可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其位运算过程相同,不需要额外的硬件电路。
- 小结:正数的原码反码补码相同,都是十进制转换成二进制位。负数的原码求补码和补码求原码过程相同,都是除最高位后按位取反加1。
位运算符
为了节约内存开销和加快计算效率,可以使用位运算符。
- 按位与&:对应位都是1结果为1,否则为0
- 按位或 |:对应位都是0结果为0,否则为1
- 按位异或:对应位相同结果为0,否则为1
- 按位取反~:正数按位取反后加1,负数按位取反
- 有符号左移<<和右移>>:正数补0,负数补1。高位溢出直接舍弃
- 无符号左移<<<和右移>>>:无论正负,高位补0
- 左移巧用
- 左移n位相当于该数乘以2的n次方,但是此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
x*=2
优化为x=x<<1
- 计算a的第b个二进制位是什么,
a&(1<<b)
- 左移n位相当于该数乘以2的n次方,但是此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。