进制
【二进制】
1.逢2进1的计数规则
2.使用2进制的好处,是设备制造成本低
3.java7提供了以 0b 开头的二进制直接量
4.二进制算法
64 32 16 8 4 2 1
----------------------
0 0 1 0 1 0 1-----16+4+1=21
5.4位数的二进制要熟练掌握
6.java中将int型转换成二进制数
Integer.toBinaryString(i)
【二进制的运算】
~(取反)
&(与)
| (或)
>>> 右移 >> 右移
<< 左移
- &运算、也是掩码计算
n = 00111101 10101011 11110100 11101011
m = 00000000 00000000 00000000 11111111 Mask、面具、掩码
k=n&m 00000000 00000000 00000000 11101011
//如上运算的意义: 称为掩码(Mask)计算,计算结果k中保存的是n的最后8位数。
int n = 0x3dabf4eb;
//int m = 0xff; //8位掩码
//int m = 0xffff; //16位掩码
//int m = 0x3f; //6位掩码
int m = 0xf; //4位掩码
int k = n & m;
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(k));
- 右移位计算>>>
将数字的整体向右移动,低位自动溢出舍弃,高位补0
b1 b2 b3 b4
n= 01101110 10100100 00011111 10110101
m=n>>>1 001101110 10100100 00011111 1011010
k=n>>>2 0001101110 10100100 00011111 101101
l=n>>>8 00000000 01101110 10100100 00011111
b4=n & 0xff;
b3=(n>>>8) & 0xff
00000000 00000000 00000000 00011111
b2=(n>>>16) & 0xff
b1=(n>>>24) & 0xff
int n = 0x6ea41fb5;
int m = n>>>1;
int k = n>>>2;
int l = n>>>8;
int b4 = n & 0xff;
int b3 = (n>>>8) & 0xff;
int b2 = (n>>>16) & 0xff;
int b1 = (n>>>24) & 0xff;
- 左移位计算<<
- 将数字的整体向左移动,高位自动溢出,低位补0
- 移位计算的数学意义:二进制左移位计算,每移动一次数字整体扩大2倍
int n = 50;
int m = n<<1; //100 - 经典面试题目
表达式 n * 8 可以替换为( n << 3)---------2^3=8
-
区别 >>> 和 >>
.>>> 称为逻辑右移位计算:无论正数还是负数,数字整体右移动低位溢出高位补0,逻辑上将数字整体右移动,不考虑符号问题。.>> 称为数学右移位计算:正数时候,数字整体右移动低位溢出高位补0
负数时候,数字整体右移动低位溢出高位补1,移动以后相当于数学除法,向小方向取正数。
正数时候
n 00000000 00000000 00000000 00110010 50
m=n>>>1 000000000 00000000 00000000 0011001 25
k=n>>1 000000000 00000000 00000000 0011001 25
g=n>>2 0000000000 00000000 00000000 001100 12
负数时候
n 11111111 11111111 11111111 11001110 -50
m=n>>>1 011111111 11111111 11111111 1100111 max-24
k=n>>1 111111111 11111111 11111111 1100111 -25
g=n>>2 1111111111 11111111 11111111 110011 -13
经典面试题目
表达式 n/2 (n>0的时候) ----可以替换为 (n>>1)---------2^1=2
【十六进制】
-
十六进制用于简写二进制!!!(在企业中,一般用十六进制表示)
-
十六进制的基数是二进制基数的4次幂
-
二进制从低位到高位的每四个数字可以缩写为一个十六进制
【补码】
-
计算机中处理负数的一种编码。其设计思路是将固定位数的二进制分一半作为负数使用
-
int类型是32位补码,分析繁琐
-
补码的对称性(取反)_
公式: -n = ~n + 1 -
经典面试题目:
System.out.println(~20+1);
如上语句输出结果是 ( B ): A.-19 B.-20 C.-21 D.-22System.out.println(~20);
如上语句输出结果是 ( C ): A.-19 B.-20 C.-21 D.-22System.out.println(~-20);
如上语句输出结果是 ( A ): A.19 B.20 C.21 D.22 -
认识负数的补码
11111111111111111111111111111011--------(-5)
11111111111111111111111111111100--------(-4)
11111111111111111111111111111101--------(-3)
11111111111111111111111111111110--------(-2)
11111111111111111111111111111111---------(-1)
0------------------------------------------0
1------------------------------------------1
10----------------------------------------2
11----------------------------------------3
100--------------------------------------4
101--------------------------------------5
//认识负数补码的值
for(int i=-150;i<=5;i++) {
System.out.println(Integer.toBinaryString(i));
}
【浮点数的进制运算太复杂不考虑】
Java浮点数采用IEEE-754标准
图1:计算机识别
图2:计数规律
图3:十六进制
图4:补码互补对称