記憶體對齊時基本都會求關於n位對齊的向上取整
go1.13.8 中channel原始碼中有這樣乙個變數hchansize用來表示hchan(channel對應的實際結構體)所需大小(申請記憶體空間時,是根據hchansize給hchan申請對應大小的記憶體空間),這個變數的值大概就是hchan的size關於maxalign向上取整下乙個較大倍數,看到原始碼實現時,就感覺真是怪物。
hchansize = unsafe.sizeof(hchan{}) + uintptr(-int(unsafe.sizeof(hchan{}))&(maxalign-1))
為了方便將上述表示式簡化為 n + ( (-n) & (a - 1)),n是unsafe.sizeof(hchan{}),a是maxalign。等價於 n + (a - (n % a))
( (-n) & (a - 1) ) 等價 a - (n % a) ?
向上取整的問題實際可以轉化為求出n距離下乙個a的倍數差多少,然後n加上這個數就可以。
當a為2的n次冪時,n % a可以轉化為 n & (a - 1),取模運算就變成了n與(a - 1) and時能留下多少個1。
計算機實際計算時是以補碼進行運算的,-n轉化為補碼,符號位不變其他位取反轉化為反碼,然後最低位+1轉化為補碼,下面分兩步講。
以n = 3, a = 8為例(實際計算時是8位元組,下面用一位元組舉例):
原碼: -n = 1000 0011
反碼: -n = 1111 1100
此時(-n) & (a - 1)實際為 (a - 1) - n % a,而咱們要求的是a - (n % a)
補碼:-n = 1111 1101
因為-n的反碼變補碼時最低位要+1,所以剛好(a - 1) - n % a + 1 = a - (n % a)
所以( (-n) & (a - 1) ) 等價 a - (n % a) 計算2的n次冪
在計算2的n次冪的時候,我們可以採用pow這個函式,但是當資料太大的時候顯然int double 等這些資料型別並不能儲存下來,就會出現問題,這個時候可以採取陣列儲存的方式。1.使用pow函式。pow x,y 為計算x的y次冪。如 pow 2,3 為計算2的3次冪。2.使用陣列儲存。核心演算法是 我...
求x的N次冪
典型的減小時間複雜度的做法是記住程式已經做的事情,避免在做重複的事情,比如使用n 1個迴圈乘法就是一直在做重複的乘x。通過記住x,x2,x4,等資料,可以大大減小時間的複雜度。程式如下 包含標頭檔案 include include using namespace std double pow int...
遞迴 高效率求2的n次冪
思路 使用翻一番的技巧。比如,2的9次 則 1 2 2 2 2 4 4 4 16 16 16 指數 1 2 4 8 能翻倍的情況下 能翻 while ex 1 不能翻倍的情況下 不能翻 則把差值作為指數遞迴計算。當差值為0時,就說明到頭了,只剩最後乙個數字。return 1 乘數字本身即可。retu...