【Java】Integer的highestOneBit方法

源码如下:

    public static int highestOneBit(int i) {
        // HD, Figure 3-1
        i |= (i >>  1);
        i |= (i >>  2);
        i |= (i >>  4);
        i |= (i >>  8);
        i |= (i >> 16);
        return i - (i >>> 1);
    }

函数作用:取 i 这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。

首先了解一下出现的一些符号

1.  “>>” 右移

i>>a:i的二进制最高位向右移动a位。i是正数,最高位补0;i是负数,最高位补1

2. “|” 或运算

a|=b即a=a|b:a和b的二进制做或运算操作,结果给a

3.“>>>” 无符号右移

i>>>a: i的最高位向右移动a位。最高位补0

实现原理:

 i |= (i >>  1):将最高位向右移动一位,做或运算。结果最高位和最高位后一位均为1。其他位可暂时忽略。

 i |= (i >>  2):将最高位向右移动两位,做或运算。由于最高位和最高位后一位均为1,右移两位再去或运算,意味着最高最和后面的三位均为1.

以此类推,运算完 i |= (i >> 16);后,i的最高位后面的位值均为1.(因为int占16位,如果是long的话,需要运算到32位)

i - (i >>> 1)  最终得到的i是从开始的最高位到结束全是1。并减去i不带符号的右移一位,即可得到一个int数据的最高位的值

上述情况是针对于i不为零和负数的情况,如果i为零,那么得到的结果始终为零。如果i位负数,那么得到的结果始终是-2147483648。即等于Integer.MIN_VALUE。(原因在于负数的最高位始终为1,即是负数的符号位)
       

参考:https://blog.csdn.net/jessenpan/article/details/9617749

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值