给一个整数,求不小于它的最小的2的幂

initial_y 2010-01-22 08:09:29
以下是我的方法,有没有更好的方法?

x = x - 1;
while ( x ) {
x = x >> 1;
i++;
}

mi = 1 << i;
...全文
1937 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
naitao2012 2011-12-07
  • 打赏
  • 举报
回复
正在看《深入理解计算机系统第二版》。。。
1楼兄弟给出的正是这本书里第二章的2.66 实验题,难度为三颗星(至少2小时工作量)。要求必须遵守“位级整数编码原则”,也就是在代码里不能用乘除发,不能用循环,分支,函数调用语句,只能用位级和逻辑运算,只能用加减法,可以使用== 和!= 判断。
搂主的方法看似简单明了,但是运行起来未必最高效;一楼的答案看似复杂,但是只用位级和逻辑运算却相当高效!!!
如果是1楼兄弟自己想出的这道题的答案,水平因该不简单!佩服佩服!很关心1楼兄弟现在的成长情况,嘿嘿~
xylicon 2010-01-22
  • 打赏
  • 举报
回复
1楼果然经典。
lwptianzi 2010-01-22
  • 打赏
  • 举报
回复
顶一楼的,踩二楼的,方法多怎么不拿出来一个教教吾等弱人呢!
initial_y 2010-01-22
  • 打赏
  • 举报
回复
明白了,经典,感谢
mstlq 2010-01-22
  • 打赏
  • 举报
回复 1
[Quote=引用 3 楼 initial_y 的回复:]
大哥,我想要个经典的,学习学习。
1楼那个是什么思路啊?
[/Quote]
x自减之后,
将最高位的1向后扩散到比它低的所有位置……
再加一,收工


简单实例

unsigned clp2(unsigned x){//0010 1100 0000 0000 0000 0000 0000 0000 0000 0001
x=x-1; //0010 1100 0000 0000 0000 0000 0000 0000 0000 0000
x= x|(x>>1); //0011 1110 0000 0000 0000 0000 0000 0000 0000 0000
x= x|(x>>2); //0011 1111 1000 0000 0000 0000 0000 0000 0000 0000
x= x|(x>>4); //0011 1111 1111 1000 0000 0000 0000 0000 0000 0000
x= x|(x>>8); //0011 1111 1111 1111 1111 1000 0000 0000 0000 0000
x= x|(x>>16); //0011 1111 1111 1111 1111 1111 1111 1111 1111 1111
return x+1; //0100 0000 0000 0000 0000 0000 0000 0000 0000 0000
}



z569362161 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 initial_y 的回复:]
大哥,我想要个经典的,学习学习。
1楼那个是什么思路啊?
[/Quote]

他是你大哥,你别弄错了。
chengzhe 2010-01-22
  • 打赏
  • 举报
回复
二楼的牛
initial_y 2010-01-22
  • 打赏
  • 举报
回复
大哥,我想要个经典的,学习学习。
1楼那个是什么思路啊?
z569362161 2010-01-22
  • 打赏
  • 举报
回复
方法有很多
mstlq 2010-01-22
  • 打赏
  • 举报
回复
unsigned clp2(unsigned x){
x=x-1;
x= x|(x>>1);
x= x|(x>>2);
x= x|(x>>4);
x= x|(x>>8);
x= x|(x>>16);
return x+1;
}

65,182

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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