今天我继续来分享几个有意思的题目。
题一:
这里所说的奇偶位指的是二进制下的奇偶位。 解析:与运算的运算规则:1&0=0,1&1=1,0&1=0,0&0=0。观察一下我们可以发现,在二进制形式下1与一个数进行与运算的结果就是那个数,而0与一个数进行与运算的结果都是0。如果我们将一个数与10101010.....进行与运算,就会保留该数的偶数位(从右往左),奇数位就会变为0。例如:9的二进制是1001,与1010进行与运算
同理如果我们将一个数与010101....进行与运算就会保留该数的奇数位,偶数位都会变成0
如果我们将保留的偶数位填上0右移一位,奇数位添上0左移一位,二者再进行异或运算会发生什么呢
由于int型的整数最多有32位,所以101010...化为16进制即为0xaaaaaaaa, 0101....化为16进制就会变为0x55555555。该题的代码如下:
结果如下:
上面这道题的解法可能很难想出来,但是没事,记住这个算法就行。
题二:
解析:这道题如果知道浮点数二进制怎么计算的话应该是很简单的,如果不清楚也没事。我下面会给大家解释。给定一个浮点数,将它×2,若结果大于1,将1记下来,并将结果减一,若小于1,就将0记下来,重复这个过程,直到最后的结果为0。如0.625*2=1.25,记下来1,减1后得0.25,0.25*2=0.5,记下来0,0.5*2=1,记下来1,减一后得0,运算结束。然后将记下的结果按顺序拼接得到101,再向前面加0.得到的0.101即为最后的结果。
搞清楚这个原理代码就很简单。
结果如下:
题三:
解析:这道题的解法有很多种,如果实在想不出来可以直接暴力,但是既然放到这个地方,那肯定不是这么简单的了。先来看一下引例:
根据上面的推理我们只要将该数组遍历进行k进制的不进位相加就行,最后得到的结果就是答案。 代码如下:
这里解释一下代码 先说一下不进位加法。 先把k进制下的每一位存起来,然后将每个数对应的位数相加,再把该数字存到一个新的数组里面,这样就没有进位,只是把这个相加后得到的数字存在了对应下标的数组里面。 这里解释一下为什么要将字符串反转后转换为字符数组。 将数字转换为k进制的字符串后,他会自动去掉高位的0,比如
由于是不进位加法,所以我们要将相加之后的数取余。 此外,将原来的字符串反转后对后面的进制转换也有好处,根据进制转换的公式,从低到高位要依次乘进制的0,1,2...次方,我们反转后刚好从低到高,这样就与下标一致,循环计算就会容易。 如果还是不太清楚的话,可以去搜一下不进位加法,或者私聊我。