欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

java.util.BitSet 分析

系統 1917 0

我們知道bit-map在大數據處理方面有著很大的用途,比如排序,去重等。

JDK 從1.0開始就提供了 java.util.BitSet 來對bit-map的支持。BitSet的set,get操作主要是通過 “位運算” 進行的。

BitSet的核心是一個 long的數組:

  1. /* ?
  2. ?????*?BitSets?are?packed?into?arrays?of?"words."??Currently?a?word?is ?
  3. ?????*?a?long,?which?consists?of?64?bits,?requiring?6?address?bits. ?
  4. ?????*?The?choice?of?word?size?is?determined?purely?by?performance?concerns. ?
  5. ?????*/ ??
  6. ???? private ? final ? static ? int ?ADDRESS_BITS_PER_WORD?=? 6 ;??
  7. ???? private ? final ? static ? int ?BITS_PER_WORD?=? 1 ?<<?ADDRESS_BITS_PER_WORD;??
  8. ???? private ? final ? static ? int ?BIT_INDEX_MASK?=?BITS_PER_WORD?-? 1 ;??
  9. ??
  10. ???? /*?Used?to?shift?left?or?right?for?a?partial?word?mask?*/ ??
  11. ???? private ? static ? final ? long ?WORD_MASK?=?0xffffffffffffffffL;??
  12. ??
  13. ???? /** ?
  14. ?????*?The?internal?field?corresponding?to?the?serialField?"bits". ?
  15. ?????*/ ??
  16. ???? private ? long []?words;??
  17. ??
  18. ???? /** ?
  19. ?????*?The?number?of?words?in?the?logical?size?of?this?BitSet. ?
  20. ?????*/ ??
  21. ???? private ? transient ? int ?wordsInUse?=? 0 ;??
  22. ??
  23. ???? /** ?
  24. ?????*?Whether?the?size?of?"words"?is?user-specified.??If?so,?we?assume ?
  25. ?????*?the?user?knows?what?he's?doing?and?try?harder?to?preserve?it. ?
  26. ?????*/ ??
  27. ???? private ? transient ? boolean ?sizeIsSticky?=? false ;??

從bit的角度看,words 應該是一個 二維的bit數據, bit [ ] [64] word, 當然 JDK中沒有 bit 這個基本的數據類型。但是JDK提供了豐富的位運算符。每個bit 只有兩個值 0 和1(ture 和false)。

bit-map的典型應用場景(偽碼表示):

有一個 bit數組 bit [ ] bArray = new bit [ 1024 ]。 要對若干非負整數進行排序,例如:{ 2, 5, 78, 58, 11}。使用bit-map的做法是:

  1. bArray[ 2 ]?=? 1 ;??
  2. bArray[ 5 ]?=? 1 ;??
  3. bArray[ 78 ]?=? 1 ;??
  4. bArray[ 58 ]?=? 1 ;??
  5. bArray[ 11 ]?=? 1 ;??

然后順序遍歷bArray就行了。

同樣對于BitSet的方法一樣,只不過要調用它的set方法,源碼如下:

  1. /** ?
  2. ?????*?Sets?the?bit?at?the?specified?index?to?{@code?true}. ?
  3. ?????* ?
  4. ?????*?@param??bitIndex?a?bit?index ?
  5. ?????*?@throws?IndexOutOfBoundsException?if?the?specified?index?is?negative ?
  6. ?????*?@since??JDK1.0 ?
  7. ?????*/ ??
  8. ???? public ? void ?set( int ?bitIndex)?{??
  9. ???????? if ?(bitIndex?<? 0 )??
  10. ???????????? throw ? new ?IndexOutOfBoundsException( "bitIndex?<?0:?" ?+?bitIndex);??
  11. ??
  12. ???????? int ?wordIndex?=?wordIndex(bitIndex);??
  13. ????????expandTo(wordIndex);??
  14. ??
  15. ????????words[wordIndex]?|=?(1L?<<?bitIndex);? //?Restores?invariants ??
  16. ??
  17. ????????checkInvariants();??
  18. ????}??

如果將 long [ ] words 理解成 bit [ ] [ 64 ] words的話?

第一步,先算出一維(wordIndex(int bitIndex) 方法)

  1. /** ?
  2. ?????*?Given?a?bit?index,?return?word?index?containing?it. ?
  3. ?????*/ ??
  4. ???? private ? static ? int ?wordIndex( int ?bitIndex)?{??
  5. ???????? return ?bitIndex?>>?ADDRESS_BITS_PER_WORD;??
  6. ????}??

notice: ADDRESS_BITS_PER_WORD = 6.

第二步,使用位運算對對應的bit進行賦值為1, words[ wordIndex ] |= (1L << bitIndex).

BitSet的get方法和Set方法一樣,先確定一維,再通過位運算得到二維中對應的值。

是不是感覺很美妙,通過long數組 再加上 位運算 可以模擬出 bit數組。當然,我們也可以使用int數組或者double行數據來構造 bit數組

java.util.BitSet 分析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 大香萑75久久精品免费 | 欧美一区二区三区成人精品 | 国产一区久久 | 成人三级视频 | 91精品中文字幕一区二区三区 | 性爱视频在线免费 | 色综合小说网 | 伊人久久精品成人网 | 国产综合久久久久影院 | 欧美成人免费丝袜视频在线观看 | a毛片视频网站 | 看免费5xxaaa毛片 | 精品国产一区二区三区四 | 成 人 黄 色 大片 | 日韩成人影院 | 午夜色a大片在线观看免费 龙珠z在线观看 | 日韩精品一区在线 | 亚洲一区二区在线视频 | 亚洲欧美一区二区三区国产精品 | 超级碰碰碰频视频免费观看 | 欧美一区二区精品 | 天天做天天爱夜夜爽女人爽宅 | 浮力影院国产第一页 | 草草国产成人免费视频 | 视频一区在线观看 | 亚洲综合亚洲综合网成人 | 久久久久久九 | 欧美一级电影视频 | 国产精品入口免费视频 | 一级做a | 久久女人被添全过程A片 | 免费二区 | 狠狠综合久久av一区二区小说 | 国产一级毛片高清视频 | 天天做天天爱天天爽天天综合 | 一级香蕉免费毛片 | 国产成人免费无庶挡视频 | 亚洲永久 | 一级做一级爱a做片性视频视频 | 一级淫片免费 | 久久综合久色欧美综合狠狠 |