十进制转化为二进制
例如要算42的二进制,会把42连续除以2直至商等于0。把得到的余数反过来排列就是 42的二进制数。
>>运算符和>>>运算符
总结:>>和 >>>都是右移位运算符,操作正整数时都是高
位插0,操作负整数时>>高位插1,>>>高位插0。
注意:>>>是java独有的运算符。
使用Integer.toBinaryString()把十进制转化为二进制
//十进制转化为二进制
String binaryNum = Integer.toBinaryString(42);
System.out.println("42的二进制:"+binaryNum);
// 42 使用右移位运算符 右移两位后,得到十进制的结果。
int num = 42 >>> 2;
//转化为二进制
System.out.println("右移两位后:"+Integer.toBinaryString(num));
输出结果:
42的二进制:101010
右移两位后:1010
hashmap tableSizeFor算法
static final int MAXIMUM_CAPACITY = 1 << 30;
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
设计该算法的用意
找出比 cap大且最接近的 二次幂。
代码解读
先来分析有关n位操作部分:先来假设n的二进制为01xxx…xxx。接着
对n右移1位:001xx…xxx,再位或:011xx…xxx
对n右移2为:00011…xxx,再位或:01111…xxx
此时前面已经有四个1了,再右移4位且位或可得8个1
同理,有8个1,右移8位肯定会让后八位也为1。
综上可得,该算法让最高位的1后面的位全变为1。
最后再让结果n+1,即得到了2的整数次幂的值了。
为什么一共只移位31位?
答:cap为int类型,占四个字节,32位。最高位为符号位,表示正负数。有用的一共就31位。
总结
例如41的二进制数为101001,想要找出比41大且最接近的二次幂,只能是 1000000(即101001 先变成 111111再加一) ,换算成十进制的则为64。因为int占32位,最高位为符号位,所以总共移位31位就可以了。