【非递归】判断一个整数是否能表示成2的指数形式(已附weapon0916兄的高效解法)

问:判断一个整数是否能表示成2的指数形式

思路:若x是2的指数倍的整数,那它的二进制位串中只有一位是1。

#include <iostream>
using namespace std;
//判断一个整数是否能表示成2的指数形式。要求算法简单。
bool p2(int n)
{
    int temp = 0;
    int l = sizeof(int) * 8;
    //整型的位宽
    for (int i = 0; i < l; i++)
        temp += (2 << i) & n;
    if (temp == n)
        return true;
    else
        return false;
}

int main(int argc, char* argv[])
{
    int n;
    cin >> n;
    if (p2(n))
        cout << n << "可以表示成2的指数形式!" << endl;
    else
        out << n << "不能表示成2的指数形式!" << endl;
    return 0;
}

 

weapon0916兄的意见很有见地,我后来又自己细想了一下,代码改为

bool p1(int n)
{
    return (n & (n-1)) == 0 ? true : false;
}

 

原因我是这样想的: 若x是2的指数倍的整数,那它的二进制位串中只有一位是1。即是说,其他非2的幂次的数—假设是y—的比特串都包含2个以上的1,那么,当n-1时,x位串上的那个1要么移位(向高位借位),要么消失;而y最右边的那个1可能消失(处于0位)也可能向左移(向高位借位),但最左边的那个1一定不会有任何改变,所以x&(x-1) == 0 而 y&(y-1) != 0。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值