免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

[算法] 如何使用位操作得到大于N且为2的次方的最小的数 [复制链接]

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
21 [报告]
发表于 2008-06-12 16:54 |只看该作者
原帖由 emacsnw 于 2008-6-12 15:27 发表
还有一个比较邪恶的:

float f = (float)(v - 1);  
return 1 > 23) - 126);

这应该是用了float存储格式

论坛徽章:
0
22 [报告]
发表于 2008-06-12 16:55 |只看该作者
嗯,IEEE浮点数格式,大致是取(2的)指数部位处理一下。

论坛徽章:
0
23 [报告]
发表于 2008-06-12 17:10 |只看该作者
原帖由 emacsnw 于 2008-6-12 15:27 发表
还有一个比较邪恶的:

float f = (float)(v - 1);  
return 1 > 23) - 126);


神奇, 不用v-1直接用v就好了,要不1就不好算了

请教23和126怎么选出来的?

论坛徽章:
0
24 [报告]
发表于 2008-06-12 17:12 |只看该作者
不错
用v-1的目的是什么呢?

论坛徽章:
0
25 [报告]
发表于 2008-06-12 17:18 |只看该作者
原帖由 emacsnw 于 2008-6-12 16:55 发表
嗯,IEEE浮点数格式,大致是取(2的)指数部位处理一下。


呵呵,明白了,为什么取23和126,呵呵, 能想到这个方法真奇才也, 佩服  

论坛徽章:
0
26 [报告]
发表于 2008-06-12 17:25 |只看该作者
23表示移去尾数部份
126表示(127-1),具体127表示什么意思察看浮点数的存储格式

论坛徽章:
0
27 [报告]
发表于 2008-06-12 17:26 |只看该作者
原帖由 chzht001 于 2008-6-12 01:18 发表


呵呵,明白了,为什么取23和126,呵呵, 能想到这个方法真奇才也, 佩服  


不是我想出来的。。。网上有。

论坛徽章:
0
28 [报告]
发表于 2008-06-12 17:49 |只看该作者
偶的方法是通过递归取到数据的最高位的1所在的offset,然后给出1<<(offset+1)。

代码就不贴了.

论坛徽章:
0
29 [报告]
发表于 2008-06-12 18:48 |只看该作者

回复 #28 拉东 的帖子

递归和循环是一个本质.

论坛徽章:
0
30 [报告]
发表于 2008-06-12 19:41 |只看该作者
做个记号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP