免费注册 查看新帖 |

Chinaunix

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

[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 21:55 |只看该作者
long int x = 1;
for (i = 0; i < sizeof(long int) * 8; i++) {
         if (n == x)
               break;
         x <<= 1;
}

论坛徽章:
0
3 [报告]
发表于 2008-06-22 22:07 |只看该作者
多谢斑竹 我那个异或有点多余

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

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

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

论坛徽章:
0
5 [报告]
发表于 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
6 [报告]
发表于 2008-06-22 22:20 |只看该作者

回复 #5 gosapphire 的帖子

那先求出数的二进制位数。

论坛徽章:
0
7 [报告]
发表于 2008-06-22 22:26 |只看该作者
还是觉得2楼的挺好的
mark

论坛徽章:
0
8 [报告]
发表于 2008-06-22 22:33 |只看该作者
原帖由 libinz 于 2008-6-22 22:12 发表

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

这个方法不错~~

论坛徽章:
0
9 [报告]
发表于 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
10 [报告]
发表于 2008-06-22 22:53 |只看该作者

回复 #9 gosapphire 的帖子

这是那本《高效程序的奥秘》上面的吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP