我正在浏览以下代码并遇到以下代码段。奇怪的按位运算符组合的目的是什么?
EFI_STATUS
EFIAPI
PeiCreateHob (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN UINT16 Type,
IN UINT16 Length,
IN OUT VOID **Hob
)
{
EFI_STATUS Status;
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
EFI_HOB_GENERIC_HEADER *HobEnd;
EFI_PHYSICAL_ADDRESS FreeMemory;
Status = PeiGetHobList (PeiServices, Hob);
if (EFI_ERROR(Status)) {
return Status;
}
HandOffHob = *Hob;
//
// Check Length to avoid data overflow.
//
if (0x10000 - Length <= 0x7) {
return EFI_INVALID_PARAMETER;
}
Length = (UINT16)((Length + 0x7) & (~0x7));
...
我没有得到什么,我们用下面的操作实现:
Length = (UINT16)((Length + 0x7) & (~0x7));
我知道的长度将是16位对齐。但是我们为什么要与全零进行AND?据我了解,我们将失去操作中的LSB 3位。这个操作有什么用?
写下纸上的“方程”,并解决它的一些随机值“长度”,看看他们成了什么。 –
我得到8的倍数。对于长度= 2,1000为00000000,对于长度= 21等。 – achoora
全部大写名称通常仅用于宏。你应该重新考虑你的命名约定。并且不要将固定宽度类型的自制软件名称使用。使用'stdint.h'。 – Olaf