代码随想录 (programmercarl.com)在做这个题时候发现数组循环%没看懂,就开始琢磨这一点,查了很多资料都没有讲,可能是这个知识比较基础(嘿嘿我基础太差了)慢慢来吧~
编程的时候,很多时候都会要求一个数在某一个范围内进行反复循环,0~100循环,0~5循环等等。一般的方法是使用if语句,当判断达到最大值的时候回到开始处。实际上使用这种方法也是可以的,但是如果有更简单更高效的方法你是否还会使用if语句呢。
先说说使用 & 的方法吧。比如说我想让一个数在0~7内循环,该如何做呢?temp = (temp++)&0x07,如此就简单的实现了0~7循环。因为要实现0~7的循环,其实只要提取一个变量递增的低三位即可。不管这个变量如何变化,它的低三位始终都是在0~7循环变化的。同理,它也可以实现0~15、0~31变化。但是这个方法有局限,它只能按照连续bit位的最大值进行循环。
现在再说 %,这个就厉害了,它不存在这个限制。可以在0~任意数循环。比如0~5循环,只要temp = (temp++)%6(注意是6而不是5),那么temp就会在0~5之间循环了(这是我在看循环队列的时候看到的方法,当时很是震惊,关于循环队列更多的东西将在循环队列中讲解)。
很神奇吧,更神奇的是使用方法它还可以计算两个变量之间的距离(因为距离时没有负数的,这里我称之为距离可能不是很好理解,慢慢来)我们知道不管是8bit数据,16bit、32bit、64bit,它始终有一个位数的限制,如何在有限的位数里面获得两个数据之间准确距离信息呢。以8bit为例,最大数为255,第一次读取为0x4,第二次读取是0x9,那么从0x04变化到0x09,变化了几次(递增数为1)? 9 – 4 = 5,如果变化后的数小于255当然好办,但是超过了255,又从0开始递增呢?这个时候又该如何。比如说一开始读取的是251,之后再读一次,变成了1,怎么算,251-1=250?肯定不对,1-250=-250,更不是?那到底变化了几次?252、253、254、255、0、1,这里可以看出是6,但是该怎么计算,又是否有一个公式可以在不改变原来数据变化的情况下将超过限制和没超过限制这两种情况的计算包含呢。有的。就是length = (num2 – num1 + max)%max。关于这个公式更详细内容请看循环队列小节。
确实,使用%可以在任意数之间循环,但是她也有限制,就是目前来看只能实现递增1的情况,我想递减呢?就是说我想从9减为0,然后从9开始继续,又该如何。我的一个项目就需要这样的变化,怎么办,如果用if确实能够解决问题,但是直觉告诉我,肯定有简单方法实现,所以我就上网搜,但是可能我搜索的方法不对,始终没有搜到,所以我暂时搁置了。直到一天夜里,回想递增循环的情况,慢慢的思考其中的本质,再结合距离计算的公式,突然明悟了。就是num--; num = (num+max)%max;这样两条语句去实现。比如9~0,就是num--; num = (num+10)%10;
那么怎么理解呢,按理说0再自减就是0xff,即255,再加10就是265,265%10 =5,怎么就变成了9呢?这和存储有关。255从有符号的角度来看,就是-1,-1+10等于9,9%10=9,没错,就是如此。但是我的变量声明不是有符号的,而是无符号的,怎么也没有出问题呢?这是因为溢出了,因为265在8bit情况下溢出就变成了9,所以计算也不会出现问题。所以这些计算机基础方面的东西一定要理解透彻清晰,才能更好的驾驭一门语言,你也会发现其中的东西真的很神奇。
标签:10,12,temp,max,num,2023.4,贪心,循环,255 From: https://www.cnblogs.com/LianIsFlying/p/17310926.html