位与运算
只有当除数是 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)。 -

