取余运算符%的神奇作用

读了鱼鹰哥的笔记 学习了

普通循环

除了常用的for,一般可以用

temp = (temp++)&0x07;//实现0-7递增循环

但这种方法只能实现bit的最大位上的范围(7,31...)
而%则是任意范围内的循环

temp = (temp++)%6;//实现0-5的循环 注意这里是6

今天大华的测评就有这道题,num%1024也可以通过num__(1024-1)实现,参考上面的知识点,这个空就应该是&

距离计算

如何在有限的位数里面获得两个数据之间准确距离信息呢。以8bit为例,最大数为255,第一次读取为0x4,第二次读取是0x9,那么从0x04变化到0x09,变化了几次(递增数为1)? 9 – 4 = 5,如果变化后的数小于255当然好办,但是超过了255,又从0开始递增呢?252、253、254、255、0、1,这里可以看出是6,但是该怎么计算。 参考循环队列的知识,可以得出以下结论。

length = (num2 – num1 + max)%max;

个人感觉就像是运动员跑圈,一个快一个慢,不论快的跑了多长距离,只要知道他当前圈内位置和慢的当前圈内位置减一下就行,也就是((快的总路程)%(一圈长度) - (慢的总路程)%(一圈长度) ),合并一下就是上述公式,括号内+max是为了防止(num2 -num1) < max的情况。
而根据我们可以得出距离的这个原理,我们也可以实现范围内的自减

//数据自减
num--; 
//当数据越界后 当作循环队列 重新判断距离 实现9-0之间的自减
//数据未越界 则不会发生变化
num = (num+10)%10;

如果是0自减为255(无符号情况),也可以视作-1,原理是一样的,所以也是通用的。

你可能感兴趣的:(取余运算符%的神奇作用)