免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9349 | 回复: 11
打印 上一主题 下一主题

如何求一个数据最接近2的幂的数. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-13 17:11 |只看该作者 |倒序浏览
输入        输出
3              4
19            16
27            32

1023      1024
...

论坛徽章:
0
2 [报告]
发表于 2009-01-13 17:21 |只看该作者
先求比这个数大的,在求小的,然后比较一下哪个近,最后输出

论坛徽章:
0
3 [报告]
发表于 2009-01-13 17:26 |只看该作者
或许还可以这样
1。位操作指令取得第一个1的bit
2。查看这个bit的低一位是否为1
3。if y, 取大的那个2幂;else 取小的那个

5  instructions,加一个返回值1条,一共6条 x86指令

[ 本帖最后由 r2r4 于 2009-1-13 17:27 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-01-13 17:55 |只看该作者
把那个整数转化成 bit string。
对了,什么叫“最接近”?接近的标准是什么?3 和 2,3 和 4,哪个更近?

论坛徽章:
0
5 [报告]
发表于 2009-01-13 18:48 |只看该作者

回复 #3 r2r4 的帖子

首先.你这方法不错!我咋没想到位操作呢.

论坛徽章:
0
6 [报告]
发表于 2009-01-13 19:47 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2009-01-13 22:17 |只看该作者
原帖由 converse 于 2009-1-13 19:47 发表
http://www.cppblog.com/converse/archive/2008/06/21/54225.html

这种浮点数的操作显然会有精度误差的
而且这个方法看上去新美妙(没用循环,没打表),但是隐含了一个从整数转化成浮点数的操作,成本不小
求最高为1的位在C语言级别没有太好的方案,这个话题经过了无数人讨论的
但是BSR/BSL两个汇编指令可以解决这个问题

论坛徽章:
0
8 [报告]
发表于 2009-01-14 10:50 |只看该作者
原帖由 r2r4 于 2009-1-13 17:26 发表
或许还可以这样
1。位操作指令取得第一个1的bit
2。查看这个bit的低一位是否为1
3。if y, 取大的那个2幂;else 取小的那个

5  instructions,加一个返回值1条,一共6条 x86指令

强人

论坛徽章:
0
9 [报告]
发表于 2009-01-14 12:31 |只看该作者
这是俺写的一个,我是菜鸟,主要是锻炼一下
  1. [root@CCOSS_484883689 c]# cat qn2.c
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define MIN(a, b)  ((a) <= (b) ? 1 : 0 )
  5. #define MAX(a, b)  ((a) >  (b) ? 1 : 0 )

  6. int NN(int x)
  7. {
  8.         int y = x;
  9.         int n = 0;
  10.         while(y && ++n)
  11.                 y >>= 1;
  12.         if(n)
  13.         {
  14.                 return MIN(x-(1<<(n-1)), (1<<n)-x) ? (n-1) : n;
  15.         }else{
  16.                 return n;
  17.         }
  18. }

  19. int main()
  20. {
  21.         int j = 13;
  22.         printf("The min 2^%d is %d\n", j, 1<<NN(j));
  23. }
复制代码

大家不要见笑

论坛徽章:
0
10 [报告]
发表于 2009-01-14 12:37 |只看该作者
原帖由 r2r4 于 2009-1-13 17:26 发表
或许还可以这样
1。位操作指令取得第一个1的bit
2。查看这个bit的低一位是否为1
3。if y, 取大的那个2幂;else 取小的那个

5  instructions,加一个返回值1条,一共6条 x86指令

不错
我的想法跟你差不多,不过我的效率低:
察看二进制是否全为1
是:返回+1
否:用最高位所在位置对2求幂并返回改值
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP