代碼
int oushu(int i) {
return i - (i >> 1 << 1) - 1;
}
逐步推導
i >> 1:算術右移 1 位,等價 i / 2 (向下取整)。
(i >> 1) << 1:左移 1 位,等價 (i / 2) * 2,即**清除最低位**,得到不大於 i 的最大偶數。
i - ((i >> 1) << 1):i 減去該偶數 → 餘數為 0 (偶數) 或 1 (奇數)。
... - 1:偶數變 -1 (非零 = true),奇數變 0 (false)。
真值表
| i | (i>>1)<<1 | i - ... | return | 含義 |
| 4 | 4 | 0 | -1 | 偶數 → true |
| 5 | 4 | 1 | 0 | 奇數 → false |
main 函數輸出
int x[] = {0,1,2,3,4,5,6,7,8,9,100,101};
for (int v : x) if (oushu(v)) printf("%d ", v);
// 輸出:0 2 4 6 8 100 (所有偶數)
現代寫法建議
// 可讀性優先
bool isEven = (i % 2 == 0);
// 或位運算
bool isEven = (i & 1) == 0;