位与运算
只有当除数是 2 的幂次方(如 2、4、8、16...)时,取模运算才可以转换为位运算。
int b = 19;int a1 = b % 16; // 传统取模运算int a2 = b & 15; // 位运算替代取模printf("b = %d\n", b);printf("b %% 8 = %d\n", a1); // 输出: 3printf("b & 7 = %d\n", a2); // 输出: 3return 0;
为什么?
-
数学原理:
当除数n
是 2 的幂次方(如n = 8
)时,b % n
的结果仅由b
的低log₂(n)
位决定。例如:b % 8
只需看b
的低 3 位(因为8 = 2³
)。b % 16
只需看b
的低 4 位(因为16 = 2⁴
)。
此时,
b % n
等价于b & (n-1)
,因为n-1
的二进制恰好是低log₂(n)
位全为 1,其余位为 0(如7
的二进制是0111
,15
的二进制是1111
)。 -