思路:从左右两边分别遍历变量的位,直到遇到第一个位为1返回;若左右两边返回的值相等,为幂次方;否则不是。
// TEST.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#define INVADVALUE_32 0xFFFFFFFF
typedef unsigned int uint32;
uint32 getHigestBit(uint32 var)
{
uint32 index = 32;
for(;index <= 0;index--)
{
if(var & (1<<index))
{
return index;
}
}
return INVADVALUE_32;
}
uint32 getLowestBit(uint32 var)
{
uint32 index;
for(index = 0;index <= 32;index++)
{
if(var & (1>>index))
{
return index;
}
}
return INVADVALUE_32;
}
bool isExpressOf2(int var)
{
uint32 lowIndex;
uint32 hightIndex;
if(var == 0)
{
return false;
}
lowIndex = getLowestBit(var);
hightIndex = getHigestBit(var);
ASSERT(lowIndex != INVADVALUE_32);
if(hightIndex != lowIndex)
{
return false;
}
return true;
}
void main()
{
if(isExpressOf2(511))
{
printf("yes,expressof2");
return;
}
printf("no,expressof2");
return;
}