日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Integer.highestOneBit(int i)方法的作用与底层实现

發(fā)布時(shí)間:2024/1/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Integer.highestOneBit(int i)方法的作用与底层实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在Integer類中有這么一個(gè)方法,你可以給它傳入一個(gè)數(shù)字,它將返回小于等于這個(gè)數(shù)字的一個(gè)2的冪次方數(shù)。這個(gè)方法就是highestOneBit(int i)。

比如下面的Demo,注意方法的輸入與返回值:

System.out.println(Integer.highestOneBit(15)); // 輸出8 System.out.println(Integer.highestOneBit(16)); // 輸出16 System.out.println(Integer.highestOneBit(17)); // 輸出16

這個(gè)方法的實(shí)現(xiàn)代碼量也是非常少的:

public static int highestOneBit(int i) {// HD, Figure 3-1i |= (i >> 1);i |= (i >> 2);i |= (i >> 4);i |= (i >> 8);i |= (i >> 16);return i - (i >>> 1); }

接下來,我們就來詳細(xì)分析一下這塊代碼的邏輯。

首先,對于這個(gè)方法的功能:給定一個(gè)數(shù)字,找到小于或等于這個(gè)數(shù)字的一個(gè)2的冪次方數(shù)。

如果我們要自己來實(shí)現(xiàn)的話,我們需要知道:怎么判斷一個(gè)數(shù)字是2的冪次方數(shù)。

說真的,我一下想不到什么好方法來判斷,唯一能想到的就是一個(gè)數(shù)字如果把它轉(zhuǎn)換成二進(jìn)制表示的話,它會(huì)有一個(gè)規(guī)律:如果一個(gè)數(shù)字是2的冪次方數(shù),那么它對應(yīng)的二進(jìn)制表示僅有一個(gè)bit位上是1,其他bit位全為0。
比如:
十進(jìn)制6,二進(jìn)制表示為:0000 0110
十進(jìn)制8,二進(jìn)制表示為:0000 1000
十進(jìn)制9,二進(jìn)制表示為:0000 1001
所以,我們可以利用一個(gè)數(shù)字的二進(jìn)制表示來判斷這個(gè)數(shù)字是不是2的冪次方數(shù)。關(guān)鍵代碼怎么實(shí)現(xiàn)呢?去遍歷每個(gè)bit位?可以,但是不好,那怎么辦?我們還是回頭仔細(xì)看看Integer是如何實(shí)現(xiàn)的吧?

public static int highestOneBit(int i) {// HD, Figure 3-1i |= (i >> 1);i |= (i >> 2);i |= (i >> 4);i |= (i >> 8);i |= (i >> 16);return i - (i >>> 1); }

我們發(fā)現(xiàn)這段代碼中沒有任何的遍歷,只有位運(yùn)算與一個(gè)減法,也就是說它的實(shí)現(xiàn)思路和我們自己的實(shí)現(xiàn)思路完全不一樣,它的思路就是:給定一個(gè)數(shù)字,通過一系列的運(yùn)算,得到一個(gè)小于或等于該數(shù)字的一個(gè)2的冪次方數(shù)。

也就是:如果給定一個(gè)數(shù)字18,通過運(yùn)算后,要得到16。

18用二進(jìn)制表示為: 0001 0010

想要得到的結(jié)果(16)是:0001 0000

那么這個(gè)運(yùn)算的過程無非就是將18對應(yīng)的二進(jìn)制數(shù)中除最高位的1之外的其他bit位都清零,則拿到了我們想要的結(jié)果。

那怎么通過位運(yùn)算來實(shí)現(xiàn)這個(gè)過程呢?

我們拿18對應(yīng)的二進(jìn)制數(shù)0001 0010來舉個(gè)例子就行了:
先將0001 0010右移1位,
得到0000 1001,再與自身進(jìn)行或運(yùn)算:
得到0001 1011。

再將0001 1011右移2位,
得到0000 0110,再與自身進(jìn)行或運(yùn)算:
得到0001 1111。

再將0001 1111右移4位,
得到0000 0001,再與自身進(jìn)行或運(yùn)算:
得到0001 1111。

再將0001 1111右移8位,
得到0000 0000,再與自身進(jìn)行或運(yùn)算:
得到0001 1111。

再將0001 1111右移16位,
得到0000 0000,再與自身進(jìn)行或運(yùn)算:
得到0001 1111。

再將0001 1111無符號右移1位,
得到0000 1111。

關(guān)于無符號右移,可以看我之前寫的文章。

最后用0001 1111 - 0000 1111 = 0001 0000
震驚!得到了我們想要的結(jié)果。

其實(shí)這個(gè)過程可以抽象成這樣:
現(xiàn)在有一個(gè)二進(jìn)制數(shù)據(jù),0001****,我們不關(guān)心低位的取值情況,我們對其進(jìn)行右移并且進(jìn)行或運(yùn)算。

先將0001****右移1位,
得到00001***,再與自身進(jìn)行或運(yùn)算:
得到00011***。

再將00011***右移2位,
得到0000011*,再與自身進(jìn)行或運(yùn)算:
得到0001111*。

再將0001111*右移4位,
得到00000001,再與自身進(jìn)行或運(yùn)算:
得到00011111。

后面不用再推算了,到這里我們其實(shí)可以發(fā)現(xiàn)一個(gè)規(guī)律:
右移與或運(yùn)算的目的就是想讓某個(gè)數(shù)字的低位都變?yōu)?,再用該結(jié)果 減去 該結(jié)果右移一位后的結(jié)果,則相當(dāng)于清零了原數(shù)字的低位。即得到了我們想要的結(jié)果。

到此,只能感嘆JDK作者對于位運(yùn)算的使用已經(jīng)達(dá)到了出神入化的境界了。

如果想學(xué)習(xí)更多的精彩的Java、分布式、微服務(wù)等方面的知識,請關(guān)注微信公眾號:1點(diǎn)25

轉(zhuǎn)載于:https://www.cnblogs.com/nicerblog/p/11431181.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Integer.highestOneBit(int i)方法的作用与底层实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久黄色一级片 | 白浆一区 | 日本精品久久久久久久 | 成人免费在线看片 | 在线播放波多野结衣 | 黄色三级免费网站 | a级黄色片免费看 | 天天做天天爱夜夜爽 | 亚洲视频在线观看一区二区三区 | 一本无码aⅴ久久久国产 | 51成人网| 国产69xx| 国产精品嫩 | 欧美高清精品 | 国产精品日韩电影 | 午夜视频在线观看一区二区 | 不卡的av在线 | www.久久.com | 婷婷伊人网 | 国产精品亚洲一区二区无码 | 国产精品毛片一区二区 | 黄色日皮视频 | 一区二区亚洲视频 | 久久青青草原亚洲av无码麻豆 | 欧美人与性禽动交精品 | 神马午夜伦| 91香蕉一区二区三区在线观看 | av天堂一区| 日韩欧美国产一区二区 | 在线二区 | 成人在线网站 | 一区二区国产精品视频 | 秘密基地免费观看完整版中文 | 午夜私人影院 | 乱h伦h女h在线视频 99999视频 | 久久短视频 | sm调教羞耻姿势图片 | 国产v综合v亚洲欧美久久 | 久久三级精品 | 成年人性视频 | 熟女人妻aⅴ一区二区三区60路 | 中文字幕码精品视频网站 | 成人久久毛片 | 日韩欧美在线精品 | 欧美日韩色综合 | 国产精品videossex久久发布 | 天天射日日操 | 一本色道久久加勒比精品 | 亚洲 欧美 激情 另类 校园 | 久久99久久99精品免视看婷婷 | 一卡二卡久久 | a久久久久久 | 在线视频日韩欧美 | 各处沟厕大尺度偷拍女厕嘘嘘 | 三级av免费看 | 91av视频在线免费观看 | 欧美高清v| 国产强被迫伦姧在线观看无码 | 久草剧场| 5个黑人躁我一个视频 | 北条麻妃在线一区 | 日韩久久高清 | 国产又粗又长又爽 | 中文字幕亚洲欧美 | 国精产品一区二区 | 91久久精品国产91性色69 | 99热这里有 | 欧美aa视频 | 操操操操操操操操操操 | 一区成人 | 国产欧美色图 | 高清久久久久久 | 在线观看免费视频 | 久草久热| 美日韩av在线 | 51成人精品网站 | 精品国产av 无码一区二区三区 | 亚洲国产成人在线观看 | 97人人爽人人爽人人爽 | 又黄又色又爽 | 最新毛片网 | 人人草人人看 | 激情超碰| 影音先锋久久 | 手机福利视频 | 97精品| 国产毛片基地 | 天天综合影院 | 亚洲福利一区二区三区 | 欧美三级色图 | 色综合中文 | av在线最新| 国产在线极品 | 麻豆出品 | 麻豆视频官网 | 九一精品在线 | 国产成人不卡 | 欧美成人吸奶水做爰 | 人妻丰满熟妇av无码区免 |