上位バイトをそのままにして、4バイト長の下位3バイトを設定するにはどうすればよいですか?
-
05-07-2019 - |
質問
関連するコードは次のとおりです:
typedef unsigned long int chunk_head;
typedef struct malloc_chunk
{
// Contains the size of the data in the chunk and the flag byte.
chunk_head head;
// Deliberately left unsized to allow overflow.
// Contains the payload of the chunk.
unsigned int data[];
};
そして、例として、" get"マクロはこれです:
//Get the size of the data contained within the chunk.
#define GET_CHUNK_SIZE(chunk) ((chunk.head) & 0xFFFFFF)
フラグにビットを使用している上位バイト-" inuse"および「合体することができます」、そして私が見つけた追加の物は有用でしょう。
タイトルで述べたように、背景情報の提供が完了したので、下位3バイトをチャンクの大きさに変更できるようにする必要があります。私の最初の本能は、適切に整列されるため、ビット単位のANDヘッダーとサイズでしたが、フラグバイトも上書きする可能性があることに気付きました。サイズに一致するまでゼロが自動的に追加されるためですあなたがビット単位で、intとlongをできることすらわからない。とにかく、大いに感謝します。
解決
方法:
head = (head & 0xff000000) | (new_size & 0x00ffffff)
他のヒント
何らかの理由で、これまでに受け取った回答のほとんどは、カーペットの下で潜在的なサイズオーバーフローの問題を一掃することを主張しています。 0x00FFFFFF
のチャンクサイズ。したがって、余分なサイズのビット(存在する場合)を静かに破棄し、サイズの完全に意味のないテール部分をフィールドに書き込みます。なぜ誰かがそのようなことをするのかわかりません。
より合理的なコードは次のようになります
assert((size & 0xFF000000) == 0);
chunk.head = (chunk.head & 0xFF000000) | size;
「および」に正当な理由はありません。 0x00FFFFFF
のサイズ。余分なサイズを静かに破棄しないで、中止するか、少なくとも過剰なサイズでアサートする必要があります。
ビットフィールドを使用してこれを行います。マクロを使用する必要がないため、デバッガーでも便利です。
typedef struct chunk_head {
unsigned size:24;
unsigned inuse:1;
unsigned cancoalesce:1;
// Room for 6 more...
};
typedef struct malloc_chunk {
struct chunk_head head;
int data[];
};
chunk.head =(chunk.head&〜0xffffffL)| (new_lower_bits)
// retain the old top 8 bits
chunk.head &= 0xFF00000000
// set the lower 24 bits
chunk.head |= (0x00FFFFFF & new_bits)
#define SET_CHUNK_SIZE(chunk, size) (chunk.head = (chunk.head & 0xFF000000) | (size & 0x00FFFFFF))
それはあなたが何を意味したのですか、何か見逃したのですか?
所属していません StackOverflow