看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 問題(Question): 最近在看怎麼控制 SATA device 的code. 下面把ALIGNED_ADDR(base, AlignUnit) 定義為後面那串實在難懂. 故上來請教各位大神們. 麻煩幫忙小弟解惑一下.3Q /*========================================================== IDE/SATA device access function implementation ===========================================================*/ #define ALIGNED_ADDR(base, AlignUnit) \ (PVOID)(((int)(base)+(AlignUnit))&~((AlignUnit)- 1)) 餵入的資料(Input): NA 預期的正確結果(Expected Output): NA 錯誤結果(Wrong Output): NA 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.22.105 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1447771987.A.170.html
LPH66: 指標對齊, 例如 ALIGNED_ADDR(malloc(...), 16) 會得到一個 11/17 23:08
LPH66: 對齊到 16-byte 倍數的指標位置 11/17 23:09
(AlignUnit))&~((AlignUnit)- 1 再請教一下這邊的"&~"是甚麼意思呢? 位甚麼後面要再減1呢? 另外照您舉例的意思,如果AlignUnit是0x10 的話也會對齊 16B是嗎? ※ 編輯: hibiscus520 (220.137.22.105), 11/17/2015 23:42:31
LPH66: 那是 & 和 ~ 兩個運算子, 詳細說的話要一篇 11/17 23:59
LPH66: 簡單講它利用這兩個位元運算子去算出一個比給定指標大的 11/17 23:59
LPH66: 某個 2 的次方數(即對齊需求)的倍數的值 11/18 00:00
hibiscus520: 好的,非常謝謝你。<(_._)> 11/18 00:06