在《原始碼剖析》的空間配置一章的二級配置器中,有如下一段源**,功能是將bytes上調至8的倍數。
enum; //小型區塊的上調邊界
private:
static size_t round_up(size_t bytes)
這裡的原始碼乍一看很難懂,但是十分高效,現在具體看一下實現原理。
這裡8是2^3,二進位制表示為00001000。前面的0
先省略了,不影響分析。
_align-1:
00001000->00000111;
~_align-1:
00000111->11111000;
bytes+align-1:x這裡如果bytes是8
的倍數,那麼低3位全是0。
***xx000->***xx111
(bytes+align-1)&(~_align-1):
***xx111->***xx000
這裡得到的是bytes本身。如果bytes不是8
的倍數呢?那麼首先
8n我們要求的就是8(n+1)。bytes用二進位制表示,低三位不全為0,加上align-1會向第4
位進製。此時將第三位清零,使用取反後相與,得到的就是8(n+1)。
這裡的簡單推導一下:
8nbytes=8n+p,p<8
p存在低3位,8n存在高三位,執行加法bytes+align-1,產生進製。現在bytes=8(n+1)+p,清零後為8(n+1)。
這個問題還可以推廣到將乙個數字上調到2^n的倍數。因為2^n的低n位必定全是0
,上面是例項n=3的情況。
3月1日中國觀點股評級 將新浪上調至買入評級
摩根大通維持在噴鼻港聯交所上市的中國聯通 nyse chu 增持 評級,賜與其目的股價為15.90港元。美國券商cowen and company重申海輝軟體 nasdaq hsft 跑贏 評級。花旗銀行維持出路無憂 nasdaq jobs 評級,將其目的股價從58美元上調至70美元。蘇格蘭皇家銀行...
JS 將數值取整為10的倍數
問題描述 將數值處理為 10 的倍數,並支援向上或者向下取整 如將 2345 可以處理為 2300 2400 3000 2000 解決方案 將數字取整為10的倍數 param num 需要取整的值 param ceil 是否向上取整 param prec 需要用0佔位的數量 const format...
求解1 n中不是5也不是6也不是8的倍數的個數
一 解法1 硬推公式 得到公式為n n 5 n 6 n 8 n 30 n 40 n 24 n 120 實現 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 inc...