学习二进制、>>和>>>运算符、hashmap tableSizeFor算法

十进制转化为二进制

十进制转化为二进制
例如要算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位就可以了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值