一)茅塞顿开的东东哦:
int类型占4个字节(byte); 一个字节=8bit(位); 一个int类型的数值占32bit(位) int i = 123; 10进制123转为二进制后等于:1111011 完整补位后:00000000 00000000 00000000 01111011
1024字节 = 1KB
二)二进制以及十进制之间的相互转换:
java方法:Integer.toBinaryString(int); // 十进制转化为二进制
Integer.parseInt("10110000000001001001011101001",2); // 多少进制转换为十进制。第一个参数为二进制字符串,第二个参数为这个字符串是多少进制的
1111011: 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 123
123:取余再倒上
三)字节以及位以及范围,终于弄懂了好高兴
注意这里的数列规律:2^0+2^1+2^2+2^3+2^4+2^5+2^6 = 2^7-1
1字节为8位,所以1字节的范围为:[-127,127]
1111 1111 = -(2^0+2^1+2^2+2^3+2^4+2^5+2^6) = -(2^7-1) = -127
0111 1111 = 2^0+2^1+2^2+2^3+2^4+2^5+2^6 = 2^7-1 = 127
所以byte,short,int,long的长度分别为:2^0、2^1、2^2、2^3字节,8*2^0、8*2^1、8*2^2、8*2^3 位
四)位与运算,位或运算,异或运算
&:只有对应的两个二进制数为1时,结果位才为1
|: 有一个为1的时候,结果位就为1
^:同则取0,异则取1
0 & 0= 0 0 | 0= 0
0 & 1= 0 0 | 1= 1
1 & 0= 0 1 | 0= 1
1 & 1= 1 1 | 1= 1
3 & 2 = 0111 & 0010 = 0010 = 2
3 ^ 5 = 0011 ^ 0101 = 0110 = 6
规律:
1)-1^(-1<<n) = 2^n-1
五)二进制的最高位为符号位,1代表负数,0代表正数,其余位表示数的绝对值:
六)计算:
*****因为位运算是CPU直接支持的,所以效率高*****
正数高位为0,负数高位为1
左移<<:正数负数都在右侧补0,负数最高位不变
右移>>:正数补0,负数最高位不变,空位补1
无符号右移:空位补0
1)5 << 2:5的二进制左移两位
5的二进制:0000 0000 0000 0101 左移两位: 0000 0000 0001 0100
2)5>>2:5的二进制右移两位
5的二进制:0000 0000 0000 0101 右移两位: 0000 0000 0000 0001
3)-5>>2:-5的二进制右移两位(不是很懂)
-5的二进制:1111 1111 1111 1011 右移两位: 1111 1111 1111 1110
面试题:
1)用最有效率的方法计算2乘以8:
常见的JDK源码里面HashMap的默认容量16:int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
2)传递两个非0的int数值进去,实现变量交换的方式:
关于异或运算符的规律:一个数与另一个数异或两次是其本身, 一个数和自身异或结果是0
int a = 2; int b = 3;
先:a = a^b;
再:b = b^a; a = a^b
参考:https://www.jianshu.com/p/927009730809