今天看HashMap源码的时候看着这么一句return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 有点忘了,毕竟现在一直写业务代码,很少遇到这种代码。 这里复习一下位运算。 (这句的意思是 key为null 直接返回 0 不为null 先取hashcode 然后计算 ^ 右边的值 h无符号右移16位。 然后 hashcode 和右移后的 数值 取 异或 操作。 )
一、进制转化
二进制:在计算机中最终的都是二进制。我们平常一般使用都是 10进制或者16进制。
1.十进制转二进制
十进制比较特殊 十进制转二进制,用十进制除以2 得余数 再翻转得到二进制。算法如下
public static String Convert2Bin(int todo){
String result = "";
while(todo > 0 ){
System.out.println(todo);
result = todo%2 +result;
todo = todo/2;
}
return result;
}
2.2的冥次进制转二进制 比如 8 进制转2 进制 16进制转二进制。 算法如下。比如十六进制的18 转化为二进制时,1 转化为4位二进制,0001 8转化4位 1000 所以转化后二进制 00011000
public static String Convert2Bin(String todo,int type){
char[] chars = todo.toCharArray();
type = (int) (Math.log(type)/Math.log(2.0));
String result = "";
String temp;
int tempint;
int index = chars.length-1;
while(index>=0){
temp = Convert2Bin(Integer.parseInt(String.valueOf(chars[index])));
tempint =type - temp.length();
while (tempint>0){
temp= "0"+temp;
tempint--;
}
index--;
result =temp+result;
}
return result;
}
二、进制运算符 (以下规则 运算对象是二进制)
1、异或^:运算规则 位数不够高位补0 相同为0 不同 1
2、位与运算& 同为1则为1 否者为0
3、位或运算| 有1为1 同0 为0
4、位非运算 单位运算,每位取反。如下
比如:~37
在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.
8转为二进制是100101.
补码后为: 00000000 00000000 00000000 00100101
取反为: 11111111 11111111 11111111 11011010
因为高位是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1。
因此,我们可将这个二进制数的补码进行还原: 首先,末尾减1得反码:11111111 11111111 11111111 11011001 其次,将各位取反得原码:
00000000 00000000 00000000 00100110,此时二进制转原码为38
所以~37 = -38.
5.带符号右移>> 4 >>2 最终为 1
6.带符号左移<< 1<< 2 最终为二进制 100 转化为十进制 4
7.不带符号右移>>> 1101010 >>> 4 为 110
时间比较紧,有些错误 请指出 ,不胜感激。