jdk11原始碼-Integer.numberOfLeadingZeros(int i)(jekyll遷移)
阿新 • • 發佈:2020-08-11
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).
每當條件成立時,包含第一個非零位的那一半長度都會通過右移的方式減半,方便了後續的判斷。