问一个不是太难的问题

anggogo 2003-10-20 02:52:57
如何得到大于或小于任意一个数a的附近有2的n次幂呢?(两个函数)
比如说,输入15和2,可以判断出大于15的数16是2的4次方
再或者比如,输入67,可以判断出小于67的数64是2的6次方


自己考虑了半天,发现自己只能想到一些非常愚蠢的算法,比如循环算出2的次方,然后当该数大于或小于a的时候就返回。如果a非常大,那简直无法接受。
...全文
50 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
anggogo 2003-10-21
  • 打赏
  • 举报
回复
大家看看我自己写的这两个函数又怎样呢?
前面的大哥写的我研究一下再给分

bool ComputeSmallestPowerOf2(double lower, double upper, long &result)
{
if (lower==1)
{
result=1;
return true;
}
long power=0;
int loop=0;
loop =(int)ceil(sqrt(lower));
do {
power = (long)pow(2.0,loop);
if (power>=lower && power<=upper)
{
result = power;
return true;
} else {
loop++;
}
} while (loop>0 || power>=upper);
return false;
}

bool ComputeLargestPowerOf2(double lower, double upper, long &result)
{
long power=0;
int loop=0;
loop =(int)floor(sqrt(upper));
do {
power = (long)pow(2.0,loop);
if (power>=lower && power<=upper)
{
if (power>pow(16.0,(double)sizeof(long)))
return false;
else
{
result = power;
return true;
}
} else {
loop--;
}
} while (loop>0 || power<=lower);
return false;
}
kfjin 2003-10-20
  • 打赏
  • 举报
回复
#include <iostream>
#include <math.h>
using namespace std;

void main()
{
int cnt=0, a;
cout << " input an INT " << endl;//只考虑正数,只说明一个算法。
cin >> a ;
do
{
a = int( a / 2 );
cnt++;
}while( a != 1 );

cout << pow( 2, cnt ) << endl;
}
Liulingbing 2003-10-20
  • 打赏
  • 举报
回复
#include <iostream>
#include <iomanip>
using namespace std;


int bpowerh(int n){
if(n < 0) return -1;
for(int i = 0; i < 32; i ++){
if(n & (0x8000 >> i)){
int tmp = 0x8000 >> (i-1);
for(; !(n & 0x8000 >> ++i) && i < 32; );
if(i < 32) n = tmp;
return n;
}
}
}
int bpowerl(int n){
if(n < 0) return -1;
for(int i = 0; i < 32; i ++){
if(n & (0x8000 >> i)){
int tmp = 0x8000 >> i;
for(; !(n & 0x8000 >> ++i) && i < 32; );
if(i < 32) n = tmp;
return n;
}
}
}

void main()
{
cout << bpowerh(96) << ' ' << bpowerl(96) << endl;
cout << bpowerh(128) << ' ' << bpowerl(128) << endl;

}
ningzhiyu 2003-10-20
  • 打赏
  • 举报
回复
若x%2==0,则返回x; //10%2=0

arfi()'s method is good.
SolidRabbit 2003-10-20
  • 打赏
  • 举报
回复
对,用二进制比较简单。
jhyu 2003-10-20
  • 打赏
  • 举报
回复
移位操作,如楼上两位所述
蝎子i软件 2003-10-20
  • 打赏
  • 举报
回复
设输入的数为x,
若x%2==0,则返回x;
否则,算术右移x,并记录次数y
直到x==0,则2<<y为大于x的数;
直到x==1,则2<<y为小于x的数.

未经验证,仅供参考!
arfi 2003-10-20
  • 打赏
  • 举报
回复
15写成2进制为0000 1111,所以比它大且为2的幂的数为0001 0000(16),比它小且为2的幂的数为0000 1000(8)。

67写成2进制为0100 0011,所以比它大且为2的幂的数为1000 0000(128),比它小且为2的幂的数为0100 0000(64)。

所以你只要确定了值为1的最高比特位,相邻的两个数也就知道了。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧