2020年11月12日

[C] Alignment Via Bitwise Operations

有時候會因為 performance / memory access 等等考量需要把不足 4/8 bytes 的資料 align 到 4/8 bytes,做法很多個,這邊列個最近看到的作法以資紀錄。

先來個最常見的作法 (以 align 4-byte 為例):

x = (x & 0x3)? (((x >> 2) + 1) << 2) : x;

簡單來說,就是判斷是不是 4 的倍數 (x & 0x3),不是的話就先除以 4,然後 + 1 後再乘以 4。這邊記錄一個更簡單的方法

x = (x + 0x3) & (~0x3)

當 x 不是 4 的倍數時 (最後 2 bits 不為 0),加上 0x3 必定會進位,然後只要再讓最後 2 bits 歸 0 (& (~0x3)) 即可。反之,x 是 4 的倍數時就會完全沒有影響。

這樣的運算內容會更少且更快。

沒有留言:

張貼留言