判断是否为2的整数幂

判断一个整数时候为2的整数幂,可以使用“与”的方法。

可以知道,2的二进制数为10,4的二进制数为100(4 = 2 * 2,即将二进制数10左移一位。)

则:

       若X为2的n次幂,n为整数,则X的二进制数为10左移 ( n - 1 )位。

       判断 X & (X - 1),如果结果为0,则是2的整次幂


注:转载请注明出处~

判断一个整数是否2,可以通过位运算来高效实现。以下是两种常见的方法: ### 方法1:利用 `x & (x - 1)` 的特性 如果一个数 `x` 是2,那么它的二进制表示中只有一个 `1` 位,其余位都是 `0`。例如: - `4` 的二进制表示是 `100` - `8` 的二进制表示是 `1000` 当对 `x` 执行 `x & (x - 1)` 操作时,会将 `x` 的最低位的 `1` 变为 `0`。如果 `x` 是2,那么 `x & (x - 1)` 的结果将是 `0`,因为 `x` 仅有一个 `1` 位。因此,可以通过以下代码判断一个数是否2: ```java public boolean isPowerOfTwo(int n) { return n > 0 && (n & (n - 1)) == 0; } ``` 此方法基于 `x & (x - 1)` 的结果为 `0` 来判断 `x` 是否2[^1]。 ### 方法2:利用 `x & -x` 的特性 在计算机中,负数以补码形式存储。`x & -x` 的结果会保留 `x` 的最低位 `1`,而将其他位变为 `0`。例如: - `4` 的二进制表示是 `100`,`-4` 的二进制表示是 `...11111100`(补码形式),`4 & -4` 的结果是 `100`,即 `4`。 - `7` 的二进制表示是 `111`,`-7` 的二进制表示是 `...11111001`,`7 & -7` 的结果是 `1`。 如果 `x` 是2,那么 `x & -x` 的结果等于 `x`,因为 `x` 的二进制只有一个 `1` 位。因此,可以通过以下代码判断一个数是否2: ```java public boolean isPowerOfTwo(int n) { return n > 0 && (n & -n) == n; } ``` 此方法基于 `x & -x` 的结果等于 `x` 来判断 `x` 是否2[^1]。 ### 方法3:数学判断 除了位运算,还可以通过数学方法判断一个数是否22的数在十进制中是 `1, 2, 4, 8, 16, 32, ...`,可以通过不断除以2判断余数是否始终为 `0`。具体实现如下: ```java public boolean isPowerOfTwo(int n) { if (n <= 0) return false; while (n % 2 == 0) { n /= 2; } return n == 1; } ``` 此方法通过循环除以2判断最终结果是否为 `1` 来确认 `n` 是否2[^2]。 ### 总结 - **方法1** 和 **方法2** 是最高效的,因为它们使用了位运算,时间复杂度为 `O(1)`。 - **方法3** 虽然直观,但效率较低,时间复杂度为 `O(log n)`。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值