このマクロが何をするのか理解できません。これらはで定義されてlinux-kernel
いますが、私の疑問はそれとは無関係です。line が何をするのか理解できません(((x)+(mask))&~(mask))
。
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
どんな助けでも感謝します。
このマクロが何をするのか理解できません。これらはで定義されてlinux-kernel
いますが、私の疑問はそれとは無関係です。line が何をするのか理解できません(((x)+(mask))&~(mask))
。
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
どんな助けでも感謝します。
あなたが番号を持っているとしましょう:0x1006
4
何らかの理由で、バイト境界に合わせたいとします。
4 バイト境界では、アラインされた値が0x1000
、0x1004
、0x1008
などであることがわかります。また、アラインされた値が であることがわかり0x1006
ます0x1008
。
どのように取得し0x1008
ますか? アライメント値のアライメント マスク4
は(4 - 1) = 0x03
今0x1006 + 0x03 = 0x1009
と0x1009 & ~0x03 = 0x1008
この操作が __ALIGN_MASK
マクロです。
4
直接0x03
(アラインメント マスク)ではなく値 (アラインメント) を渡したい場合は、ALIGN
マクロがあります。
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
アラインメントa
は の型にキャストされx
、次に 1 が減算されます。アラインメントは 2 のべき乗である必要があります。これにより、 のタイプのビット パターンの数00..011..11
、x
マスク ( 1 のk
場合a = 2^k
) が得られます。
それで
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
は、マスクの値を に追加しますx
。これ(x)+ (mask)
は、アライメントの最小の倍数と少なくとも同じ大きさでx
、次に大きい倍数よりも小さくはなく、次の倍数よりも小さくなります。次に、マスクのビットごとの補数を使用して、その数をアライメントの倍数に減らします。
フォームのマスクの2^k - 1
場合、計算
(x + mask) & ~mask
と同じです
(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))
また
((x + 2^k - 1)/(2^k)) * (2^k)