我正在瀏覽以下代碼並遇到以下代碼段。奇怪的按位運算符組合的目的是什麼?
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