遇到使用字节位操作解决的问题。 如何判断一个整数的二进制表示是否至少包含两个连续的1?
问题本身并不复杂。 可以使用二元运算来完成。 方法有很多种。 不同方法的效率也有很大差异。 下面我们用C和C来实现和比较。
方法一:从头到尾遍历每一位,看是否有连续的1。
这种方法是最常见的,也是第一眼想到的方法。 我们来看看它的具体实现。
代码:
def method_1(n) : last_is_one = False this_is_one = False while n > 0: this_is_one = n % 2 if this_is_one and last_is_one: return True n = n >> 1 last_is_one = this_is_one return False
在上述实现中,首先对整数n进行余数运算(n%2)。 如果余数为1,则n的最后一位为1,否则为0,记录当前位; 然后判断本次和上次的最后一位是否都是1,如果是,则可以判断该整数有两个连续的1。 否则,n 左移一位,并继续循环开头的余数运算。
方法二:不需要遍历每一位,但仍然是位运算:移位一位(左移或右移均可),然后与原数“按位与”。
这个原理并不复杂,想一想:
基于以上推理,算法大大简化,只需一行代码即可完成。
文本的其余部分是一行代码,用于确定整数二进制中的连续 1!