求余和与操作的互换

老鼠爱cheese 2015-04-30 04:03:54
昨天写了个环形缓冲区的程序,在根据读写指针计算缓冲区当前数据个数的时候发现两种写法都可以。
代码简单描述:
#define SIZE 0x4000
int main(int argc, const char * argv[])
{
uint32 w,r;
uint32 d1,d2;

w = 0x200;
r = 0x220;

d1 = (w - r)%SIZE;
d2 = (w - r)&(SIZE -1);

printf("d1 = %x ",d1);
printf("d2 = %x\n",d2);
return 0;
}

我只是知道这么写,但是让我解释的话却不能说明白。其实是自己理解的不够彻底,希望有人帮我详细解释一下,谢谢!
...全文
125 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao_julians 2015-05-01
  • 打赏
  • 举报
回复
一,仅当size是2的N次方时,两个运算结果相同,等效。 二,当除数为2的N次方时,整除运算结果的余数是被乘数的低N位,商是被乘数的剩余高位,相当于在被乘数的低N位处截取低N位, 三,2的N次方减1的结果是得到低N 位为全1的屏蔽字,按位与任一整数的结果是该整数的低N位 四,效率是后一个高,位运算快 五,高效程序的奥秘……我记得是这个书名,是关于位运算的最佳书籍
一根烂笔头 2015-04-30
  • 打赏
  • 举报
回复
纠正“对2幂求模运算,本质也就是屏蔽低位,保留高位”-》对2幂求模运算,本质也就是屏蔽高位,保留低位
一根烂笔头 2015-04-30
  • 打赏
  • 举报
回复
两种等价,只在SIZE是2的幂才成立 size -1一般称为掩码,当size是2的幂时,减1,就形成一个低位是1,高位是0的掩码,比如01000 - 1 = 00111 对2幂求模运算,本质也就是屏蔽低位,保留高位
灌水号 2015-04-30
  • 打赏
  • 举报
回复
w - r 值是0xffffffe0 0xffffffe0 % 0x4000 = 0x3fe0 0x4000 -1=0x3ffff 0xffffffe0&0x3ffff = 0x3fe0 凑巧而已,你把size 定义成0x4003肯定不行。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧