Java数据类型和进制

776 阅读6分钟

进制

  • 进制是一种进位的方式,x进制表示逢x进1.

不同进制的表示

  • 二进制: 由0,1组成,以0b开头
  • 八进制: 由0,1,...7组成,以0开头
  • 十进制: 由0,1,...9组成, 默认为十进制
  • 十六进制:由0,1,...9,a,b,c,d,e,f组成,以0x开头

进制转换

任意进制到十进制的转换
十进制 -----------------> 十进制
12345 = 1*10^4 + 2 *10^3 + 3*10^2 + 4*10^1 + 5*10^0 = 12345
二进制 -----------------> 十进制
100 = 1*2^2 + 0*2^1 + 0*2^0 = 4
八进制 -----------------> 十进制
100 = 1*8^2 + 0*8^1 + 0*8^0 = 64
十六进制 -----------------> 十进制
100 = 1*16^2 + 0*16^1 + 0*16^0 = 256
十进制到任意进制的转换
十进制 -----------------> 二进制
20 --------> 20 / 2 = 10  余数 0 
             10 / 2 = 5   余数 0 
              5 / 2 = 2   余数 1
              2 / 2 = 1   余数 0
              1 / 2 = 0   余数 1       
                        = 0b1100

十进制二进制快速转换法

在这种编码方式中,每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。

1      1     1    1     1    1    1    1
128   64    32    16    8    4    2    1
二进制到十进制转换,将每一位的1与上表中数值对应相加
1010100    =   64 + 16 + 4 =  84
十进制到二进制转换,将十进制数与上表比较,大于或等于即写1后面补其0
100 > 64 写 1 减64得36 36 > 32 写1 得4 4不大于16和8写0
1100100

二进制快速到八进制、十六进制、拆分组合法

  • 二进制 ---------> 八进制
  • 0b1011001 将三位二进制为一组拆分 计算出十进制制 组合
001  011  001
1     3    1
八进制为 0131
  • 二进制 ---------> 十六进制
  • 0b1011001 将四位二进制为一组拆分 计算出十进制制 组合
0101   1001
 5       9
十六进制为 0x59

原码 反码 补码

  • 在计算机内,所有数据运算都采用补码来操作的。
  • 原码:就是二进制定点表示法,即最高位为符号为,0表示正,1表示负,其余表示数值。
  • 反码:正数的反码与原码相同,负数的反码除了符号位,其他位逐位取反。
  • 补码:正数的补码与原码相同,负数的补码是在其反码的末尾加1.
原码:  
    符号位              数值位
+7     0                0000111
-7     1                0000111
反码:
    符号位              数值位
+7     0                0000111
-7     1                1111000
补码:
    符号位              数值位
+7     0                0000111
-7     1                1111001

Java数据类型的默认转换(隐式转换)

  • boolean类型不能转换为其他数据类型
  • Java整型默认为int类型,浮点型默认为double类型
  • byteshortchar类型在相互参与运算时会提升为int类型,返回也为int类型。
  • 如果参与运算的变量中有longfloatdouble会首先提升为较大的类型参与运算。

逻辑与&、逻辑或|、逻辑异或^

  • 逻辑&左右两边都为true结果才为true
  • 逻辑|左右两边有一个为true结果为true
  • 逻辑^左右两边相同为flase,不同为true
  • 一个数据对另一个数据^2次,结果不变
    • a ^ b ^ b结果仍然为a
  • 应用:不使用中间变量,交换2个变量的值
int a = 3;
int b = 9;
a = a ^ b;   // 将 a ^ b 的值 保存在 a 中
b = a ^ b;   // 这一步 取的是ab初始的值 相当于 a ^ b ^ b 将a的值保存在b中
a = a ^ b;   // 此时b相当于原来的a值,这里相当于 原先的 a ^ b ^ a
System.out.println(a + ", " + b);
  • 多个数按位|的结果,将结果再按位&其中任何数,结果位仍为该数本身。
int a = 3, b = 9, d = 12;
int c = a | b | d;
System.out.println(c & a); // 3
System.out.println(c & b); // 9
System.out.println(c & d); // 12

左移<<、右移>>、无符号右移>>>

  • 左移:对二进制数补码:左边最高位丢弃,右边补齐0
  • 右移:对二进制数补码:最高位是0,左边补齐0,最高位是1,左边补齐1,右边丢弃
  • 无符号右移:对二进制数补码:无论最高位是0或1,左边补齐0,右边丢弃
    左移动:相当于作乘法,移动几位相当于乘以2的几次幂
    3 >> 2
    00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100
    可以得出结论左移相当于:3 * 2^2    
    
    右移动正数:相当于作除法,移动几位相当于除以以2的几次幂
    24 >> 2 = 24 / 2^2 = 24 / 4 = 6
    24 >>> 2 = 24 / 2^2 = 24 / 4 = 6
    
    右移动负数: -24 >> 2
    源码:10000000 00000000 00000000 00011000    
    反码:11111111 11111111 11111111 11100111
    补码:11111111 11111111 11111111 11101000
    11111111 11111111 11111111 11101000 补码右移2 ---->
    11111111 11111111 11111111 11111010
    补码:11111111 11111111 11111111 11111010
    反码:11111111 11111111 11111111 11111001
    原码:10000000 00000000 00000000 00000110
    所以得出结果为 -6