このマクロが何をするのか理解できません。これらはで定義されて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)