【源码】jdk11源码-Integer.numberOfLeadingZeros(int i)

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).

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值