免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-22 21:44 |显示全部楼层 |倒序浏览
前两天碰到的,我是用异或来做的,不知道有没有其它更简单的方法?
void ifTwothPower(const long int n)
{
        int i;
        int compareto = 1;

        for (i = 0; i < 64; i++)
        {
                if ( !(n^compareto) )
                {
                        std::cout << i << std::endl;
                        break;
                }
                compareto <<= 1;
        }
}

当时是想如果是2的N次方,不考虑符号的问题,所有bit位的和肯定为1,但是不知道怎么用c操作bit位。

论坛徽章:
0
2 [报告]
发表于 2008-06-22 22:07 |显示全部楼层
多谢斑竹 我那个异或有点多余

不知道还有没有有没有其它的思路?

论坛徽章:
0
3 [报告]
发表于 2008-06-22 22:16 |显示全部楼层
原帖由 libinz 于 2008-6-22 22:12 发表

若a为2的N次方,则a最高位为1,其他位为0,那么(a-1)正好相反,只有最高位为0,其他位为1,
然后做a和(a-1)的 位与就行了,结果为0则a为2的N次方。


忘了说,要打出N…………:wink:

论坛徽章:
0
4 [报告]
发表于 2008-06-22 22:45 |显示全部楼层
自己google了一下

判断有多少个1可以这么做
x = (x & 0x55) + ((x >> 1) & 0x55);   
x = (x & 0x33) + ((x >> 2) & 0x33);   
x = (x & 0x0f) + ((x >> 4) & 0x0f);   
return x;

当时没想出来这么算有多少个1~

论坛徽章:
0
5 [报告]
发表于 2008-06-22 22:59 |显示全部楼层

回复 #10 scutan 的帖子

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

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

论坛徽章:
0
6 [报告]
发表于 2008-06-22 23:28 |显示全部楼层
  弄了本E文的电子版看看先

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

能够拥有一本缺货的书这么想就没什么气的了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP