免费注册 查看新帖 |

Chinaunix

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

[C] 如何判断一个long int数为2的N次方用认为最简单的方法 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-06-22 22:59 |只看该作者

回复 #10 scutan 的帖子

今天第二次看到这本书名 找本看看

不过今天翻programming pearl 上面用2分的方法解决字符串旋转的方法和这个类似

论坛徽章:
0
12 [报告]
发表于 2008-06-22 23:09 |只看该作者
《高效程序的奥秘》上面讲这类东西比较多,当初刚买了没多久,china-pub就特价了,气死我了,现在已经缺货了
http://www.china-pub.com/18801

论坛徽章:
0
13 [报告]
发表于 2008-06-22 23:13 |只看该作者

回复 #12 tyc611 的帖子

我有一本,不过只是翻了一翻,没有细看。在遇到问题的时候再去查它

论坛徽章:
0
14 [报告]
发表于 2008-06-22 23:15 |只看该作者

回复 #13 scutan 的帖子

这个对做底层的帮助大点,对一般的应用程序员帮助不大,除了闲得无聊时变着花样玩

论坛徽章:
0
15 [报告]
发表于 2008-06-22 23:22 |只看该作者
老题目了。  这些东西不算妖 还是有用的

论坛徽章:
0
16 [报告]
发表于 2008-06-22 23:28 |只看该作者
  弄了本E文的电子版看看先

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
17 [报告]
发表于 2008-06-22 23:31 |只看该作者
减一,再求1的位数。
如果任意长的位操作均为常数时间,则时间该计算的时间复杂度为o(logn),n为整形的位宽。

论坛徽章:
0
18 [报告]
发表于 2008-06-22 23:34 |只看该作者
原帖由 tyc611 于 2008-6-22 23:09 发表
《高效程序的奥秘》上面讲这类东西比较多,当初刚买了没多久,china-pub就特价了,气死我了,现在已经缺货了
http://www.china-pub.com/18801

能够拥有一本缺货的书这么想就没什么气的了

论坛徽章:
0
19 [报告]
发表于 2008-06-22 23:55 |只看该作者

位操作指令 来凑数 ;)

#define _bsf(num) ({ \
                register int __res; \
                __asm__("bsfl %%eax,%%eax" \
                            :"=a" (__res):"0"(num)); \
                __res;})
#define _bsr(num) ({ \
                register int __res; \
                __asm__("bsrl %%eax,%%eax" \
                            :"=a" (__res):"0"(num)); \
                __res;})
main(int ac, char **av)
{
        int i = atoi(av[1]);
        int j = _bsf(i);
        int k = _bsr(i);
        if( j == k)
        {
                printf("y\n");
        }
        else
        {
                printf("n\n");
        }
}

可惜对这个不熟悉,否则也不用2个define

[ 本帖最后由 r2r4 于 2008-6-23 00:08 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2008-06-23 04:55 |只看该作者
原帖由 gosapphire 于 2008-6-22 05:44 发表
前两天碰到的,我是用异或来做的,不知道有没有其它更简单的方法?
void ifTwothPower(const long int n)
{
        int i;
        int compareto = 1;

        for (i = 0; i < 64; i++)
        {
                if ( !(n^compareto) )
                { ...



x & (x-1) == 0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP