Integer之numberOfLeadingZeros

源碼為

public static int numberOfLeadingZeros(int i) {
        // HD, Figure 5-6
        if (i == 0)
            return 32;
        int n = 1;
        if (i >>> 16 == 0) { n += 16; i <<= 16; }
        if (i >>> 24 == 0) { n +=  8; i <<=  8; }
        if (i >>> 28 == 0) { n +=  4; i <<=  4; }
        if (i >>> 30 == 0) { n +=  2; i <<=  2; }
        n -= i >>> 31;
        return n;
    }

該方法的作用是將i的二進制表示的數(shù)前面的0的個數(shù)返回,
由于負數(shù)第一位符號位是1,所以必然返回0

     if (i >>> 16 == 0) { n += 16; i <<= 16; }

i >>> 16,這表示i向右移動16位衅谷,與i>>16不同
'>>右移時如果是正數(shù)會補0,負數(shù)會補1似将,而>>>只會補0,舉例

8>>2  =  0100 -> 0001
8>>>2 = 0100 -> 0001
-8>>2 = 1100 -> 1111  //實際上負數(shù)是以補碼形式保存,這里只是舉例
-8>>>2 = 1100 -> 0011  // 高位補0

在看源碼

i >>> 16 == 0
// 00000000 00000000 00000000 00000000 

實際上表示的是前16位為0蚀苛,

 i <<= 16

表示將i左移16位后再賦值給i在验,整句的意思是如果i前16位為0,則把后16位移動到前16位堵未,并給后16位補0腋舌。
通俗點講就是,先判斷前面16位是不是0渗蟹,如果是0就把前16位去掉块饺,后面的頂上赞辩。
后續(xù)的

if (i >>> 24 == 0) { n +=  8; i <<=  8; }

i>>>24實際上判斷的是8位,之后再判斷前4位授艰,再判斷前2位

        if (i >>> 16 == 0) { n += 16; i <<= 16; }
        if (i >>> 24 == 0) { n +=  8; i <<=  8; }
        if (i >>> 28 == 0) { n +=  4; i <<=  4; }
        if (i >>> 30 == 0) { n +=  2; i <<=  2; }
        n -= i >>> 31;

n就是統(tǒng)計0的數(shù)量辨嗽,但是我們注意到n的初始值為1,按理說不應(yīng)該是0嗎淮腾?
原因在最后一句糟需,如果i>>>31即i的末位是0的話,n應(yīng)該要再加上1谷朝,但是這里實際上是減去了末位的值0洲押,即少加了1,而如果末位的值是1本應(yīng)該跳過圆凰,但這里卻多減了1杈帐,所以n的初始值不是0而是1.

n -= i >>> 31;
也可以看做
if (i >>> 31 == 1) { n -=  1;  }

至于作者為什么要這樣寫,不得而知专钉,如果你有什么看法歡迎留言討論~
如果把n的初始值設(shè)為0挑童,這個方法也可以這么寫

public static int numberOfLeadingZeros(int i) {
        // HD, Figure 5-6
        if (i == 0)
            return 32;
        int n = 0;
        if (i >>> 16 == 0) { n += 16; i <<= 16; }
        if (i >>> 24 == 0) { n +=  8; i <<=  8; }
        if (i >>> 28 == 0) { n +=  4; i <<=  4; }
        if (i >>> 30 == 0) { n +=  2; i <<=  2; }
        if (i >>> 31 == 0) { n += 1;};
        return n;
    }

這種二分判斷法方法讓原來需要比較32次減少至比較5次,大大提高了效率
它還有一個姐妹方法驶沼,統(tǒng)計從右邊開始的0個數(shù)炮沐,類似就不再敘述了

public static int numberOfTrailingZeros(int i) {
        // HD, Figure 5-14
        int y;
        if (i == 0) return 32;
        int n = 31;
        y = i <<16; if (y != 0) { n = n -16; i = y; }
        y = i << 8; if (y != 0) { n = n - 8; i = y; }
        y = i << 4; if (y != 0) { n = n - 4; i = y; }
        y = i << 2; if (y != 0) { n = n - 2; i = y; }
        return n - ((i << 1) >>> 31);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市回怜,隨后出現(xiàn)的幾起案子大年,更是在濱河造成了極大的恐慌,老刑警劉巖玉雾,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔试,死亡現(xiàn)場離奇詭異,居然都是意外死亡复旬,警方通過查閱死者的電腦和手機垦缅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驹碍,“玉大人壁涎,你說我怎么就攤上這事≈就海” “怎么了怔球?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浮还。 經(jīng)常有香客問我竟坛,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任担汤,我火速辦了婚禮涎跨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崭歧。我一直安慰自己隅很,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布驾荣。 她就那樣靜靜地躺著外构,像睡著了一般。 火紅的嫁衣襯著肌膚如雪播掷。 梳的紋絲不亂的頭發(fā)上审编,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音歧匈,去河邊找鬼垒酬。 笑死,一個胖子當著我的面吹牛件炉,可吹牛的內(nèi)容都是我干的勘究。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼斟冕,長吁一口氣:“原來是場噩夢啊……” “哼口糕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磕蛇,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤景描,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秀撇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體超棺,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年呵燕,在試婚紗的時候發(fā)現(xiàn)自己被綠了棠绘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡再扭,死狀恐怖氧苍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泛范,我是刑警寧澤候引,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站敦跌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柠傍,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一麸俘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惧笛,春花似錦从媚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間然痊,已是汗流浹背邪码。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邻储,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像般眉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子潜支,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344