结论
替换公式:a%b=a&(b-1)
注意:只能被用于对2^n进行求余(b等于2的n次方)
测试
#include <stdio.h>
#include <Windows.h>
int main (void)
{
int t;
LARGE_INTEGER t1, t2, tc;
//求余运算符使用时间
QueryPerformanceFrequency(&tc);
QueryPerformanceCounter(&t1);
for (int i = 0; i < 65535; i++)
{
t=i%8;
}
QueryPerformanceCounter(&t2);
printf("百分号求余运算程序耗时:%lf\n",(double)(t2.QuadPart-t1.QuadPart)/(double)tc.QuadPart);
//位运算使用时间
QueryPerformanceCounter(&t1);
for (int i = 0; i < 65535; i++)
{
t=i&7;
}
QueryPerformanceCounter(&t2);
printf("位运算求余运算程序耗时:%lf\n",(double)(t2.QuadPart-t1.QuadPart)/(double)tc.QuadPart);
int y=0;
for (int i=0; i < 8; i++)
{
y=i&7;
printf("%d,",y);
}
return 0;
}
从以上结果可以看出,位运算效率确实会比直接使用求余运算符快,在实际开发中,我认为可以先用%把代码写好之后再一步步的优化效率(第三行是位运算从0~7对8求余的结果,证明正确性)