1

インタビューサンプルの1つでこの質問に出くわしました。16バイトのアラインされた割り当ては、標準ライブラリのみを使用してアラインされたメモリを割り当てる方法ですでに回答されています。

しかし、最後の4ビットをゼロにするために使用されるマスクに関して同じ質問があります。このマスク「〜0F」は、結果のアドレスが16で割り切れるように使用されています。32バイトのアラインメント/除算性で同じことを実現するにはどうすればよいですか?

4

1 に答える 1

5

まず、あなたが言及した質問は、16 ビットのアラインメントではなく、16 バイトのアラインメントです。

実際の質問に関しては、4 ビットではなく 5 ビットをマスクして、結果を 32 バイトに揃えたいだけです。です~0x1F

少し明確にするために:

ポインターを 32 バイト境界に揃えるには、アドレスの最後の 5 ビットを 0 にする必要があります (100000 は 2 進数で 32 なので、32 の倍数は 00000 で終わります)。

0x1F はバイナリで 11111 です。これはポインターであるため、実際にはいくつかの 0 の後に 11111 が続きます。たとえば、64 ビット ポインターでは、59 個の 0 と 5 個の 1 になります。~ は、これらの値が反転されていることを意味します。つまり、~0x1F は 59 個の 1 の後に 5 個の 0 が続きます。

を取得するptr & ~0x1Fと、ビットごとの & により、1 で & されたすべてのビットが同じままになり、0 で & されたすべてのビットが 0 に設定されます。したがって、ptr の元の値になります。最後の 5 ビットが 0 に設定されていることを意味します。これが意味することは、ptr を 32 の倍数にするために、0 から 31 の間の数値を減算したことです。これが目標でした。

于 2012-07-30T03:18:37.553 に答える