在 Android 系統底層開發(如 Binder 驅動、記憶體管理、位圖操作)中,經常需要將任意位元數轉換為佔用的 unsigned long 整數個數。這不僅是單位換算,更關係到記憶體對齊與分配效率。核心宏定義如下:
#define BITS_PER_LONG (sizeof(unsigned long) * 8) #define BITS_TO_LONGS(x) (((x) + BITS_PER_LONG - 1) / BITS_PER_LONG)
unsigned long 的位元寬度(32 位系統為 32,64 位系統為 64),保證跨平台兼容性。(x + divisor - 1) / divisor 是整數運算中經典的「向上取整」公式。若 x 能被 divisor 整除,結果不變;否則自動進位。
(x) 和整個表達式外層括號,防止傳入複雜表達式(如 BITS_TO_LONGS(a+b))時因運算符優先級導致邏輯錯誤。#include <stdio.h>
#define BITS_PER_LONG (sizeof(unsigned long) * 8)
#define BITS_TO_LONGS(x) (((x) + BITS_PER_LONG - 1) / BITS_PER_LONG)
int main(void) {
int i = 40;
int j = 1000;
// 假設 64 位系統:BITS_PER_LONG = 64
printf("40 bits -> %d longs\n", BITS_TO_LONGS(i)); // 輸出 1
printf("1000 bits -> %d longs\n", BITS_TO_LONGS(j)); // 輸出 16
return 0;
}
運行結果(64 位環境):
40 bits -> 1 longs 1000 bits -> 16 longs
BITS_TO_LONGS(n) 個 long 來表示 n 個標誌位。這個看似簡單的宏,體現了系統級 C 語言開發中「無分支編程」、「跨平台抽象」與「邊界條件處理」的核心思想。掌握此類位運算技巧,是寫出高性能、可移植底層代碼的基本功。