zoukankan      html  css  js  c++  java
  • jdk11源码Integer.numberOfLeadingZeros(int i)(jekyll迁移)

    layout: post
    title: jdk11源码-Integer.numberOfLeadingZeros(int i)
    date: 2019-11-05
    author: xiepl1997
    tags: 源码阅读

    Integer.numberOfLeadingZeros(int i)源码如下:

    public static int numberOfLeadingZeros(int i) {
    	if (i <= 0) {
    		return i == 0 ? 32 : 0;
    	} else {
    		int n = 31;
    		if (i >= 65536) {
    			n -= 16;
    			i >>>= 16;
    		}
    
    		if (i >= 256) {
    			n -= 8;
    			i >>>= 8;
    		}
    
    		if (i >= 16) {
    			n -= 4;
    			i >>>= 4;
    		}
    
    		if (i >= 4) {
    			n -= 2;
    			i >>>= 2;
    		}
    
    		return n - (i >>> 1);
    	}
    }
    
    • 函数功能
      该方法的作用是返回无符号整形i的最高非零位前面的0的个数,包括符号位在内。
      如果i为负数,即符号位为1,则返回0
      比如10的二进制表示为00000000 00000000 00000000 00001010
      java的整型长度为32,那么这个方法返回的就是28

    • 分析
      很巧妙地应用了二分查找。
      将n初始化位31,因为i不为负数不为0的话,最大的结果应该为31。
      先把i分为了高16位和底16位,如果i > 2^16,则说明i的高16位存在1,则n -= 16,将i右移16位。
      若i > 2^8,则说明i的高8位存在1,则n -= 8,将i右移8位。
      若i > 2^4,则说明i的高4位存在1,则n -= 4,将i右移4位。
      若i > 2^2,则说明i的高2位存在1,则n -= 2,将i右移2位。
      最后得到结果n - (i >>> 1).

    每当条件成立时,包含第一个非零位的那一半长度都会通过右移的方式减半,方便了后续的判断。

    计算机研狗一只
  • 相关阅读:
    CSP2020 游记
    关于对拍
    联考day7
    CSP 模拟26
    动态规划
    JAVA单元测试的用法和要点(入门篇)
    乐观锁和悲观锁的区别
    并发基础篇(六):线程Thread类的start()方法和run()方法【转载】
    this和super差异
    Java中的static关键字解析
  • 原文地址:https://www.cnblogs.com/xiepl1997/p/13479769.html
Copyright © 2011-2022 走看看