當前位置:首頁 » 操作系統 » 尾碼和源碼

尾碼和源碼

發布時間: 2023-05-25 11:50:50

『壹』 電影源代碼最後是什麼意思,為什麼源代碼會影響真實世界

我是這么想的。。最後收到簡訊的古德溫的世界··和之前拔電源的古德溫的世界·不是一個世界···是源代碼計劃無意中創造出來的另一個世界,而電影開始到結束主角不只執行一次8分鍾世界..而且每執行一次就等於創造了一個另一個世界.而創造出的N個另一個世界也都在繼續執行源代碼任務·所以等於等於7點40-8點左右的時間創造了N個世界.一生二,二生四。四生八的規律。而最讓我重視的是電影最後的那一次世界.假設那是X世界·從X世界開始的一生二生四生八就會亂套··
不懂就把我寫的看完吧。
===================
繼續分析·斯蒂文斯最後想要再回去8分鍾世界·那個時候他就已經非常懷疑那不只是8分鍾世界那麼簡單`所以很想去驗證或者去看那美妞-0- 最後如願以償的去了·(為什麼非常懷疑,因為郵件是8分鍾結束前發的,為什麼要結束前發而不是結束後直接聯系古德溫·稍後告訴你)·

斯蒂文斯他以為8分鍾後他的思維會消失或者火車還會爆炸·那麼就沒辦法去找這個世界的古德溫當面證實·所以他利用爆炸犯的手機·先發了個郵件給這個世界的古德溫·提醒古德溫源:「代碼創造的不只是8分鍾·而是創造了另一個世界·比如我們現在的這個世界。並用幾個簡單的話證明自己不是亂說。 (郵件內容自己去重看)
===================
可能有些人理解能力不夠。。如果最後的郵件這么說的話·就好理解點了·

致斯蒂文斯的郵件:

「我就是那個斯蒂文斯的靈魂。我用尚恩的身體阻止了爆炸,.所以我知道爆炸飯名字.也知道你們的源代碼計劃。也知道你古德溫的官方郵箱,更知道要去執行任務的人的名字!所以相信我,源代碼創造出的不只是8分鍾·而是另一個世界·也就是我們現在的這個世界·』
======================
如果你是古德溫·你也不會不信這個郵件的。除非你覺得你活在哈利波特的世界.一切都有可能....占卜分身魂上身等都是浮雲一樣那麼自然...
------------ 這里是電影劇情外的分析。。

無語啊·這電影里好像斯蒂文斯來回去了N次8分鍾世界·就等於創造了N個世界,不過也沒什麼·不是一個空間·沒什麼影響·但是最後一次就發現問題了!

如果每個執行代碼任務的人的思維都像最後一次那樣在另一個世界用別人的身體生存下來·那這樣早晚有一個世界是亂套的·到處都是同一個思維的人..除非政府秘密暗殺-_-,或者可以強制換回思維.. 為什麼亂套?

假設最後一次的世界為X世界·斯蒂文斯的思維用尚恩存在著·而X世界的源代碼任務執行人還是斯蒂文斯(也只有他可以執行)·繼續執行源代碼任務的話·還會創造另一個S世界,然後斯蒂文斯的思維又在另一個人(假設那人叫佩恩)存在了下來·那麼這個S世界有個佩恩的人的思維是斯蒂文斯,,而這個S世界是X世界復制過來的。。。所以這個S世界就有尚恩和佩恩···尚恩和佩恩都是斯蒂文斯的思維·····

就這樣循環下去··早晚一個世界亂套·當然最安逸的是最早的世界.-。-

斯蒂文斯的郵件並沒有說明這個·因為他發郵件的時候也不知道會繼續存在下去·那俺就代表個人提醒電影世界裡的世界要注意執行源代碼吧-。-哈哈、,暗殺或者程序修改。反正原版主角是不知道可以附體後繼續生存的,說服他任務里自殺有難度吧-。-

『貳』 +0或者-0的源碼、反碼、補碼

[+0]原碼=0000 0000, [-0]原碼=1000 0000

[+0]反碼=0000 0000, [-0]反碼=1111 1111

[+0]補碼=0000 0000, [-0]補碼=0000 0000

補碼沒有正0與負0之分。正數的反碼、補碼和其源碼相同,負數的反碼是其源碼,除符號位外其他位取反負數的補碼是取其反碼後加1。

詳細釋義:

所謂原碼就是二進制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。

(一)反碼表示法規定:

1、正數的反碼與其原碼相同;

2、負數的反碼是對正數逐位取反,符號位保持為1;

(二)對於二進制原碼10010求反碼:

((10010)原)反=對正數(00010)原含符號位取反= 反碼11101 (10010,1為符號碼,故為負)

(11101) 二進制= -2 十進制

(三)對於八進制:

舉例 某linux平台設置了默認的目錄許可權為755(rwxr-xr-x),八進製表示為0755,那麼,umask是許可權位755的反碼,計算得到umask為0022的過程如下:

原碼0755= 反碼 0022 (逐位解釋:0為符號位,0為7-7,2為7-5,2為7-5)

(四)補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。

(2)尾碼和源碼擴展閱讀

轉換方法

由於正數的原碼、補碼、反碼表示方法均相同,不需轉換。在此,僅以負數情況分析。

(1) 已知原碼,求補碼。

例:已知某數X的原碼為10110100B,試求X的補碼和反碼。

解:由[X]原=10110100B知,X為負數。求其反碼時,符號位不變,數值部分按位求反;求其補碼時,再在其反碼的末位加1。

1 0 1 1 0 1 0 0 原碼

1 1 0 0 1 0 1 1 反碼,符號位不變,數值位取反

1 +1

1 1 0 0 1 1 00 補碼

故:[X]補=11001100B,[X]反=11001011B。

(2) 已知補碼,求原碼。

分析:按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1 有方法。

例:已知某數X的補碼11101110B,試求其原碼。

解:由[X]補=11101110B知,X為負數。

採用逆推法

1 1 1 0 1 1 1 0 補碼

1 1 1 0 1 1 0 1 反碼(末位減1)

1 0 0 1 0 0 1 0 原碼(符號位不變,數值位取反)

『叄』 數據結構C語言。求源代碼

這里L是函數輸入鏈表的頭結點,L->next指向鏈表的第一個元素。
進入Reverse函數,先將p、q這兩個臨時指針指向鏈表的第一個元素。此時將L->next賦為空值,即L的next不再指向鏈表第一個元素了(想想此函數的目的是:要將L->next從鏈表的一頭指向另一頭。就回明白這里的含義了)
進入循環,這時p、q都指向了鏈表的第一個元素,循環結束條件是q等於空,即while(q)表示如果q不為空NULL,則進行循環。

q=q->next; //既然q不等於空,q就再往後走走,看看還有沒有結點。
p->next=L->next;
L->next=p;
p=q;
//這里L->next是上一次循環時指向的p,而後p走到下一個節點,那麼這里p->next=L->next就是將p當前節點的next指到它前一個節點去。從而達到逆序的效果。

這里可能你會覺得最開始L->next=NULL,很奇怪~
其實不會,第一個節點的next將指向L->next即為空,因為第一個節點正是反向後的尾巴,最後一個節點,它的next應該為空才對升純。

循環進行第二輪時,你就應該明白吵伏咐,此時q會先跑到第三個節點去,當前的p指向第二個節點,L->next在第一輪循環中指向了第一個節點,然後將第二個節點的next指向了第一個節點。L->next又指向當前的p,即第二個節點,這次循環的最後p又追上q,指向了第三個節點,如此循環,直到q等於原鏈表的最後一個節點的next,廳清這應該是空NULL,結束循環。

『肆』 原碼,反碼,補碼,移碼

寫在前面:該文章為本人學習中寫的一些筆記和心得,發表出來主要是為了記錄自己的學習過程。本人才疏學淺,筆記難免存在不足甚至紕漏,但會不定期更新。

基本知識:假設有一個n位的二進制數

則這個二進制數共有 種狀態,這個數最大為

反過來 ,寫成二進制為1000 0000,一共有8位,1後面 7 個小數

以下舉例均為n位數,實例為8位數

原碼

簡單直接的二進制,以下以定點數為例。

定點純小數: 0 100 0000 首位為符號位,0為正1為負,這里表示0.1(10)

定點純整數: 0 000 0001 這里表示1(10)

因為有符號位,所以有正負零之分 0 000 0000 和 1 000 0000

數據范圍:-127~127(後面7位全為1)//公式表達為

特點:原碼不適合加減,但 適合乘除

反碼

正數的反碼與其原碼相同;負數的反碼是對其符號位後的原碼逐位取反,符號位不變(為1)

反碼能表達的數據范圍:與源碼一樣

補碼

目的:方便計算機進行加減

特點:在機器中適合加減的數字表示方式

補碼能實現計算機"加上負數"的本質原理是模運算,也就是A減去B等於A加上B相對於A的補數再求模。就好像時鍾順時針撥動3h和逆時針撥動9h得到的結果一樣。

二進制求補碼:

補數=(原數+模)(mod 模),很明顯,若原碼是正,則補碼是它本身,對於正數完全不用考慮求補碼。

對於計算機,因為兩個相加的數的位數相同(n),且和不能超過n+1位,因此應該取的模是100000...(n個0)。

因此對於n位純小數,它的模(十進制)為2 ,對於n位純整數,它的模為2 n

模 : (1 0 000 0000)

原碼: ( 0 000 0000)

注意到,盡管符號位沒有任何數值信息,這里取模依然把符號位考慮進去了,原因是我們可以通過定義補碼,來使第一個符號位參與計算機計算,從而得到想要的結果。

(同時,把符號位算進去可以讓我們在用數學公式法求二進制補數時,直接從結果得到補碼

例: x= -0.1011

[x]補=10+x=10.0000-0.1011=1.0101

原來是要取模得補數為0.0101(2),但正好首位的1可以表示原數的負號,因此可直接讀出補碼為1 0101

因此對於補碼,符號位既起指示正負號的作用,又參與運算。

另外,區別於原碼有兩個0(正負0),在補碼的規定中,只有一個0(00000...的正0,因為原碼也全是0),而1 0000...可以表示-1(補碼純小數)或-2 n-1 (補碼純整數)

//可以這么記(以純整數為例):因為後面n-1個0取反後為n-1個1,加1後為2 n-1 (10),前面一個1表示負數,因此補碼能表示-2 n-1

補碼怎麼來:原碼為正,補碼與原碼相同;原碼為負,後面的位數為原碼取反加1

移碼

目的:為了方便計算機比大小,消除符號位對計算機的干擾

原理是把負數部分全部移到非負數方向,也就是說要把第一位符號位的意義給消除掉。消除方法為:對於補碼的正數,符號位由0變為1,增大;對於補碼的負數,符號位概念消除,在計算機中被定義為正數,又為了確保原負數小於原正數,符號位由1變為0。

為了保證每個數之間大小關系不變,要用補碼來轉換成移碼,用原碼來轉換的話,負數之間的大小關系會反轉。

數學公式:
宏觀上來看是把居中的整個數軸平移到了非負半軸上,每個數之間的大小關系不變。

純小數[X] =1+X

純整數 [X] = (一般標准)

移碼怎麼來: 移碼和補碼尾數相同,符號位相反 (也就是補碼 首位的1->0 ;0->1)

因為移碼從補碼那裡來,所以也能額外多表示一個數

『伍』 速成首碼+尾碼

低速成碼 : 人一 (OM)
人戈 (OI) 頭速成碼 : 一金 (MC) 思速成碼 : 田心 (WP) 故速成碼 : 十大 (JK) 鄉速成碼 : 女中 (VL) 夕速成碼 : 弓戈 (NI) 陽速成碼 : 弓竹 (NH) 無速成碼 : 人火 (OF) 限速成碼 : 弓女 (NV) 好速成碼 : 女木 (VD) 車速成碼 : 十十 (JJ) 走速成碼 : 土人 (GO) 圖速成碼 : 田田 (WW) 素速成碼 : 手火 (QF) 錄速成碼 : 金水 (CE) 右速成碼 : 大口 (KR) 酒速成碼 : 水田 (EW) 全速成碼 : 人土 (OG) 2012-12-06 19:13:32 補充: 低 速成碼 : 人一 (OM)
人戈 (OI) 頭 速成碼 : 一金 (MC) 思 速成碼 : 田心 (WP) 故 速成碼 : 十大 (JK) 鄉 速成碼 : 女中 (VL) 夕 速成碼 : 弓戈 (NI) 陽 速成碼 : 弓竹 (NH) 無 速成碼 : 人火 (OF) 限 速成碼 : 弓女 (NV) 好 速成碼 : 女木 (VD) 車 速成碼 : 十十 (JJ) 走 速成碼 : 土人 (GO) 圖 速成碼 : 田田 (WW) 素 速成碼 : 手火 (QF) 錄 速成碼 : 金水 (CE) 右 速成碼 : 大口 (KR) 酒 速成碼 : 水田 (EW) 全 速成碼 : 人土 (OG)
參考: me
車 JJ 十十 圖 WW 田田 走GO 土人 素QF 手火 錄CE 金水 右KR 十口 酒EW 水田
低 :人一7
頭 :一金 7
思 :田心1
故 :十大3
鄉 :女中5 夕 :弓戈1
陽 :弓竹2
無 :人火7
限 :弓女1
好 :女木1 車 :十十2
圖 :田田1
走 :土人2
素 :手火1
錄 :金水3
右 :大口2
酒 :水田2 希望幫到你^^ 我要最佳 =]
參考: me

『陸』 美軍戰斗機垂直尾翼上噴塗的字母與數字都是什麼意思,舉個例子!

那個是尾碼。
我們一般從美國軍用飛機的垂尾部分的信息看出該機所屬部隊、駐扎基地等信息,尾部的兩個大寫的字碧並談母就是所謂的尾碼。尾碼一般由兩個字母組成,大小隨飛機的大小而不同,一般在教練機等較小的機體上高度為15英寸(約38厘米),在F-15這類戰機上高度為24英寸(約60厘米),大型的運輸機的機體上高度為 36英寸(約90厘米)。雙字母尾碼最早始於60年代初的海軍,空軍是在60年代末才開始使用的,最早使用的系統是太平洋空軍司令部。大約到80年代時全軍已經普及尾碼。尾碼一般是按照基地來設置的,在同一個基地內的軍機一般使用同一尾碼,因而通過尾碼能識別軍機的基地。
尾碼還有一個作用,即英文字母加上機號的後三位數字就構成了該機的無線電呼號,這也是為什麼機號的後三位數字的字體要大一些的原因。
垂尾的尾碼下面是飛機的機號(Serial Number),也叫服役號、系列號。美國空軍使用機
號始於1912年(那時還叫陸軍航空兵),到1921年時加上了財務年號,並沿用至今。現在的格式是AF XX-YYYY,一般書寫成AF XX-YYY,其中AF是指空軍Air Force,XX是飛機交付時財務年度的前2年,YYYY是那年度交付飛機的流水數字,這些流水數字一般都是連續的,除二戰期間的1941~1945這幾年由於戰時飛機生產量極大是五位外,其餘都是四位的。有時流水數字也會被打亂,像幾架總統專機「空軍一號」都賦予了特別的編號。機號通常被標在飛機的垂尾上,形式一般是AF疊在XX上方,YYY用比「AF」和「XX」大一倍的字體標出。機號還會寫在機頭、座艙蓋或風擋玻璃下方,寫在垂尾上的機號多寫成只有後4位5位的情況,特別是在大型飛機上。此外一些空軍飛機的後部的機身上有一個塗裝標牌,指出塗裝的日期和地點,和機身各區域所用的塗料的FS色彩編碼,這可是不可多得的模型塗裝資料。
尾碼不同於嗡嗡碼(Buzz Number,也稱Buzz Code)。嗡嗡碼是在二戰後到50年代這段時期使用的,形式上也是兩個大寫的英文字母加機號的後三位數字,不同的是兩個大寫的英文字母的第一位代表飛機的用途,第二位代表飛機的型號。例如戰斗機用F(較早的時候用P,驅逐機)、轟炸機用B等。嗡嗡碼塗在機身的兩側,非常醒目。
相同基地中的不同中隊主要是依靠垂尾上的識別帶來區分。識別帶的顏色主要是紅黃藍綠白黑等常用色彩,一個中隊用一種或兩種組合顏色。有些中隊還在識別帶中加上中隊的徽章或綽號。有時一些軍機的尾碼和識別帶都相同,這時就主要靠機型來識別了。例如太平洋空軍司令部下屬的90戰機中隊和355戰機中隊尾碼都是AK,識別帶也都是紅色,但90戰機中隊使用F-15E戰機,而355戰機中隊則使用A-10A。此外一些州的空中國民警衛隊採用的是當地的州旗來作為識別帶。
上面說的是一般的情況,也有些例外的,如駐歐空軍司令部下屬的第100空中加油聯隊351空中加油中隊的KC-135R加油機的尾碼只有一個 「D」。又如盧克空軍基地的蔽鉛尾碼為LF,但944聯隊(屬於空軍預備役司令部)的F-16戰斗機的尾碼則為LN。391戰悔碰機中隊的F-15E戰機垂尾使用虎紋識別色帶,有些機體垂尾無識別色帶,有些戰機則在垂尾識別色帶塗上整個聯隊的色彩。
美軍的尾碼與基地及部隊的准確對應關系很難找到全面的對應關系列表,一般來說尾碼中的兩個英文字母都來自於所駐扎基地的英文名稱,例如AV ——義大利阿維亞諾(Aviano),EL——阿拉斯加的艾爾門多夫(Elmendorf),LN——英國拉肯希思(Lakenheath)等等。但例外的也不少,例如內華達州內利斯(Nellis)用的是WA,因此,一份詳細完整的表單在手,對於識別、研究美國空軍軍機是很重要的。
以下的尾碼表單是我多年搜集整理的結果,包含美國空軍的主要的四個一線作戰司令部:空中作戰司令部(ACC,Air Combat Command,由原戰術空軍司令部兼並戰略空軍司令部而成)、航空教育訓練司令部(AETC, Air Ecation And Training Command)、駐歐空軍司令部(USAFE ,United States Air Force In Europe)、太平洋空軍司令部(PACAF,Pacific Air Force,包含原阿拉斯加空軍司令部),不包括空中國民警衛隊(ANG,Air National Guard)、空軍預備役司令部(AFRC/AFRES,Air Force Reserve Command)、空軍裝備司令部(AFMC,Air Force Materiel Command)等。
尾碼表單中第一欄是部隊情況,第二欄是裝備機型,第三欄為尾碼和識別帶,第四欄是備注。因為機型換代、部隊變更等原因尾碼的變動較大,可能有很多的地方會有較大的錯誤,僅供參考!

『柒』 計算機病毒可分為哪四類

計算機病毒的分類:

(1)按入侵的途徑分:可分為源碼型病毒;入侵型病毒;操作系統型病毒;外殼型病毒。

①源碼型病毒(少見):是指那些用高級語言編寫的,在編譯之前能插入到源程序中的計算機病毒。

②入侵型病毒(編寫較難) :將自己插入到感染的目標程序中,使病毒程序與目標程序成為一體。

③操作系統型病毒(多見):是指使病毒加入或替代操作系統的工作,將正常的引導程序搬到其它扇區,而使自身占據磁碟引導扇區。常用的有「小球」、「大麻」等病毒。

④外殼型病毒:將病毒程序隱藏在主程序的首尾。這種病毒最多。

(2)按破壞的程度分:可分為良性病毒和惡性病毒。

①良性病毒:只對系統的正常工作進行干擾,但不破壞磁碟數據和文件。

②惡性病毒:刪除和破壞磁碟數據和文件內容,使系統處於癱瘓狀態。

(3)按攻擊的機型分:可分為攻擊微機的病毒;攻擊小型機的病毒;攻擊工作站的病毒;攻擊大型機的病毒。

(4)按攻擊的系統分:可分為攻擊DOS系統的病毒;攻擊Windows系統的病毒;攻擊UNIX系統的病毒;攻擊OS/2系統的病毒。其中大多數是攻擊DOS系統的病毒,而現在越來越多的是攻擊Windows系統的病毒。

計算機病毒具有傳播性、隱蔽性、感染性、潛伏性、可激發性、表現性或破壞性。計算機病毒的生命周期:開發期→傳染期→潛伏期→發作期→發現期→消化期→消亡期。

計算機病毒是一個程序,一段可執行碼。就像生物病毒一樣,具有自我繁殖、互相傳染以及激活再生等生物病毒特徵。計算機病毒有獨特的復制能力,它們能夠快速蔓延,又常常難以根除。

(7)尾碼和源碼擴展閱讀:

計算機病毒可以像生物病毒一樣進行繁殖,當正常程序運行時,它也進行運行自身復制,是否具有繁殖、感染的特徵是判斷某段程序為計算機病毒的首要條件。

計算機中毒後,可能會導致正常的程序無法運行,把計算機內的文件刪除或受到不同程度的損壞。破壞引導扇區及BIOS,硬體環境破壞。

病毒依附存儲介質軟盤、硬碟等構成傳染源。病毒傳染的媒介由工作的環境來定。病毒激活是將病毒放在內存, 並設置觸發條件,觸發的條件是多樣化的, 可以是時鍾,系統的日期,用戶標識符,也可以是系統一次通信等。條件成熟病毒就開始自我復制到傳染對象中,進行各種破壞活動等。

病毒的傳染是病毒性能的一個重要標志。在傳染環節中,病毒復制一個自身副本到傳染對象中去。

『捌』 網站尾部信息源碼在哪裡

在網頁的空百地方,點擊滑鼠右鍵查看源文件就看到了。
具體方法:
打開瀏覽器,在地址欄中輸入要查看的「網址」,點擊「回車鍵」,在頁面中點擊「右鍵」,選擇「查看網頁源代碼」即可。
打開瀏覽器,在地址欄中輸入要查看的「網址」,點擊「回車鍵」,同時按下「Ctrl+U」即可查看網頁源代碼。
打開瀏覽器,在地址欄輸入「view-source:要查看的網址」,點擊「回車鍵」即可查看網頁源代碼。
在網頁界面點擊右上角的「三個點」圖標,選擇「更多工具」,點擊「開發者工具」,即可查看網頁源代碼。

『玖』 浮點數八位尾數取捨問題 例:設浮點數價碼為4位補碼。尾數是8位源碼。底數是2。求x=+50.75D的浮點形式

計算機中出現小數,用定點和浮點表示,不過定陸派點表早尺賀示的范圍小,故一般用浮點表示,例如+50.75 D的二進制數為01010000.011101011101即0.1010000011101011101X2設字長為32,八位作階24作尾數各一位階符,則表困衡示為
至於由原碼求補碼是原碼除符號位變反末位加一便得反碼

『拾』 golang map源碼淺析

golang 中 map的實現結構為: 哈希表 + 鏈表。 其中鏈表,作用是當發生hash沖突時,拉鏈法生成的結點。

可以看到, []bmap 是一個hash table, 每一個 bmap是我們常說的「桶」。 經過hash 函數計算出來相同的hash值, 放到相同的桶中。 一個 bmap中可以存放 8個 元素, 如果多出8個,則生成新的結點,尾接到隊尾。

以上是只是靜態文件 src/runtime/map.go 中的定義。 實際上編譯期間會給它加料 ,動態地創建一個新的結構:

上圖就是 bmap的內存模型, HOB Hash 指的就是 top hash。 注意到 key 和 value 是各自放在一起的,並不是 key/value/key/value/... 這樣的形式。源碼里說明這樣的好處是在某些情況下可以省略掉 padding 欄位,節省內存空間。

每個 bmap設計成 最多隻能放 8 個 key-value 對 ,如果有第 9 個 key-value 落入當前的 bmap,那就需要再構建一個 bmap,通過 overflow 指針連接起來。

map創建方法:

我們實際上是通過調用的 makemap ,來創建map的。實際工作只是初始化了hmap中的各種欄位,如:設置B的大小, 設置hash 種子 hash 0.

注意 :

makemap 返回是*hmap 指針, 即 map 是引用對象, 對map的操作會影響到結構體內部

使用方式

對應的是下面兩種方法

map的key的類型,實現了自己的hash 方式。每種類型實現hash函數方式不一樣。

key 經過哈希計算後得到hash值,共 64 個 bit 位。 其中後B 個bit位置, 用來定位當前元素落在哪一個桶里, 高8個bit 為當前 hash 值的top hash。 實際上定位key的過程是一個雙重循環的過程, 外層循環遍歷 所有的overflow, 內層循環遍歷 當前bmap 中的 8個元素

舉例說明: 如果當前 B 的值為 5, 那麼buckets 的長度 為 2^5 = 32。假設有個key 經過hash函數計算後,得到的hash結果為:

外層遍歷bucket 中的鏈表

內層循環遍歷 bmap中的8個 cell

建議先不看此部分內容,看完後續 修改 map中元素 -> 擴容 操作後 再回頭看此部分內容。

擴容前的數據:

等量擴容後的數據:

等量擴容後,查找方式和原本相同, 不多做贅述。

兩倍擴容後的數據

兩倍擴容後,oldbuckets 的元素,可能被分配成了兩部分。查找順序如下:

此處只分析 mapaccess1 ,。 mapaccess2 相比 mapaccess1 多添加了是否找到的bool值, 有興趣可自行看一下。

使用方式:

步驟如下:

擴容條件 :

擴容的標識 : h.oldbuckets != nil

假設當前定位到了新的buckets的3號桶中,首先會判斷oldbuckets中的對應的桶有沒有被搬遷過。 如果搬遷過了,不需要看原來的桶了,直接遍歷新的buckets的3號桶。

擴容前:

等量擴容結果

雙倍擴容會將old buckets上的元素分配到x, y兩個部key & 1 << B == 0 分配到x部分,key & 1 << B == 1 分配到y部分

注意: 當前只對雙倍擴容描述, 等量擴容只是重新填充了一下元素, 相對位置沒有改變。

假設當前map 的B == 5,原本元素經過hash函數計算的 hash 值為:

因為雙倍擴容之後 B = B + 1,此時B == 6。key & 1 << B == 1, 即 當前元素rehash到高位,新buckets中 y 部分. 否則 key & 1 << B == 0 則rehash到低位,即x 部分。

使用方式:

可以看到,每一遍歷生成迭代器的時候,會隨機選取一個bucket 以及 一個cell開始。 從前往後遍歷,再次遍歷到起始位置時,遍歷完成。

https://www.qcrao.com/2019/05/22/dive-into-go-map/

https://draveness.me/golang/docs/part2-foundation/ch03-datastructure/golang-hashmap/

https://www.bilibili.com/video/BV1Q4411W7MR?spm_id_from=333.337.search-card.all.click

熱點內容
scratch少兒編程課程 發布:2025-04-16 17:11:44 瀏覽:642
榮耀x10從哪裡設置密碼 發布:2025-04-16 17:11:43 瀏覽:368
java從入門到精通視頻 發布:2025-04-16 17:11:43 瀏覽:89
php微信介面教程 發布:2025-04-16 17:07:30 瀏覽:312
android實現陰影 發布:2025-04-16 16:50:08 瀏覽:794
粉筆直播課緩存 發布:2025-04-16 16:31:21 瀏覽:347
機頂盒都有什麼配置 發布:2025-04-16 16:24:37 瀏覽:213
編寫手游反編譯都需要學習什麼 發布:2025-04-16 16:19:36 瀏覽:818
proteus編譯文件位置 發布:2025-04-16 16:18:44 瀏覽:369
土壓縮的本質 發布:2025-04-16 16:13:21 瀏覽:596