1. 程式人生 > 實用技巧 >jdk11原始碼-Integer.numberOfLeadingZeros(int i)(jekyll遷移)

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

每當條件成立時,包含第一個非零位的那一半長度都會通過右移的方式減半,方便了後續的判斷。