这段代码用于检查一个整数 num
是否是 2 的某个正整数次方(例如 2, 4, 8, 16, 32, ...)。如果是 2 的某个次方,那么该数在二进制表示中只有一个 1,其余位都是 0(例如,4 是 0100
,16 是 10000
)。
代码的关键部分是 if (num & num - 1)
这行。为了理解这行代码的工作原理,我们需要考虑以下几点:
- 对于任何 2 的正整数次方,其二进制表示都只有一个 1,其余位都是 0。
- 当我们从这个数中减去 1 时,这个唯一的 1 会变成 0,而它右边的所有 0 都会变成 1。
- 如果我们对原始数和减去 1 后的数执行按位与操作(
&
),结果将是 0,因为原始数的那个 1 和减去 1 后的数对应位置的 0 进行按位与操作的结果是 0,其余位置要么是 0 & 0 要么是 1 & 1,结果都是 0。
例如:
- 如果
num
是 4(二进制0100
),那么num - 1
是 3(二进制0011
)。 4 & 3
的结果是0000
。
然而,如果 num
不是 2 的某个次方,那么它的二进制表示中至少有两个 1。减去 1 后,至少会有一个 1 的位置不变,所以按位与操作的结果不会是 0。
例如:
- 如果
num
是 6(二进制0110
),那么num - 1
是 5(二进制0101
)。 6 & 5
的结果是0100
(不是 0)。
因此,如果 num & num - 1
的结果不是 0,那么 num
就不是 2 的某个次方,程序会输出错误消息并返回 -1。如果 num
是 2 的某个次方,那么 num & num - 1
的结果是 0,程序会继续执行而不会进入这个 if
语句块。