&按位与操作

文章分析了代码片段,通过解释num&num-1操作如何检测一个整数是否为2的正整数次方,指出这是通过检查二进制表示中是否有多个连续的1来实现的。非2的次方数在按位与后结果不为0,而2的次方则结果为0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段代码用于检查一个整数 num 是否是 2 的某个正整数次方(例如 2, 4, 8, 16, 32, ...)。如果是 2 的某个次方,那么该数在二进制表示中只有一个 1,其余位都是 0(例如,4 是 0100,16 是 10000)。

代码的关键部分是 if (num & num - 1) 这行。为了理解这行代码的工作原理,我们需要考虑以下几点:

  1. 对于任何 2 的正整数次方,其二进制表示都只有一个 1,其余位都是 0。
  2. 当我们从这个数中减去 1 时,这个唯一的 1 会变成 0,而它右边的所有 0 都会变成 1。
  3. 如果我们对原始数和减去 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 语句块。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值