如何设置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 the size of the data contained within the chunk.
#define GET_CHUNK_SIZE(chunk) ((chunk.head) & 0xFFFFFF)
高位字节我正在使用标志位 - “inuse”和“可以合并”,我找到的任何其他的将是有用的。
现在我已经完成了提供背景信息,正如我在标题中所说的那样,我需要能够将较低的3个字节更改为块的大小。我最初的本能是按位和大小的标头,因为它会正确对齐,但后来我意识到它也可能会覆盖标志字节,因为它会自动加上零,直到它的大小与长整数相匹配。我甚至不确定你可以按位和一个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