不使用循环,判断一个数是否是2的N次方
2016-12-25 23:09
197 查看
对于判断一个数是否为2的N次方问题,通常想到的最为直接的办法就是对这个数不断对2取余,为0就将该数变为该数除以2,直到最后该数为1为止。
void judge(int n)
{
while(!(n % 2))
{
n = n / 2;
}
printf(“NO!\n”);
return;
}
不过上面的方法并不是较好的方法,其实还有更为简洁高效的方法
一个整数,若是2的n次方,有没有想过对这个整数的2进制进行考虑,比如12,它的二进制为:1100
2 10
4 100
13 1101
16 10000
32 100000
从上面的举例我们发现,凡是2的N次方的整数,其二进制码只有一个1。
假设A为要证明的整数,B等于A-1,我们假设A为2的N次方数,那么A&B = 0,这很好证明。那是不是满足A&B = 0就能证明A是2的N次方数呢?
假设一个数的二进制为1000000000000000(这里为int型:两个字节),那这个数减去1则变为0111111111111111。我们知道,在计算机中,数都是以其二进制的补码放置的,最高位为1代表负数,最高位为0代表正数。上面两个数中,
1000000000000000为负数,0111111111111111为正数,这两个数相与为0,但1000000000000000并不是2的N次方(2的N次方为正数)。
因此,倘若一个数为2的N次方,那么该数应满足大于0且该数和该数减一后的值相与等于0时才为2的N次方。
void judge(int n)
{
if((n > 0) && (n & (n -1) ==0))
{
printf(“Yes!\n”);
return;
}
printf(“NO!\n”);
return;
}
void judge(int n)
{
while(!(n % 2))
{
n = n / 2;
if(n == 1) { printf("yes!\n); return; }
}
printf(“NO!\n”);
return;
}
不过上面的方法并不是较好的方法,其实还有更为简洁高效的方法
一个整数,若是2的n次方,有没有想过对这个整数的2进制进行考虑,比如12,它的二进制为:1100
2 10
4 100
13 1101
16 10000
32 100000
从上面的举例我们发现,凡是2的N次方的整数,其二进制码只有一个1。
假设A为要证明的整数,B等于A-1,我们假设A为2的N次方数,那么A&B = 0,这很好证明。那是不是满足A&B = 0就能证明A是2的N次方数呢?
假设一个数的二进制为1000000000000000(这里为int型:两个字节),那这个数减去1则变为0111111111111111。我们知道,在计算机中,数都是以其二进制的补码放置的,最高位为1代表负数,最高位为0代表正数。上面两个数中,
1000000000000000为负数,0111111111111111为正数,这两个数相与为0,但1000000000000000并不是2的N次方(2的N次方为正数)。
因此,倘若一个数为2的N次方,那么该数应满足大于0且该数和该数减一后的值相与等于0时才为2的N次方。
void judge(int n)
{
if((n > 0) && (n & (n -1) ==0))
{
printf(“Yes!\n”);
return;
}
printf(“NO!\n”);
return;
}
相关文章推荐
- 不使用循环,判断一个数是否是2的N次方
- c语言==判断一个数是否为2的整数次方【不使用循环】(23)
- c语言==判断一个数是否为2的整数次方【不使用循环】
- C语言——不使用循环判断一个数是否为2的N次方
- 不使用循环或递归判断一个数是否为3的幂(leetcode 326)
- 创建一个FileputStream类对象读取文件中的内容,并使用循环判断是否到达文件尾
- 用最简单的函数实现功能:判断一个int数据是否是2的x次幂(不能使用循环)。
- 用一个表达式而不是一个循环语句 判断一个数X是否是2的N次方(2,4,8,16......)
- 输入任意大小的三个整数,判断其中是否有两个奇数一个偶数。若是,则输出“YES”,不是则输出“NOT” (要求用条件表达式进行判断,不使用if语句)
- 不良代码展示-不要用数组循环判断等于的方式,来判断一个对象是否在一个集合内
- Oracle之游标, 作业的使用, 判断一个表中是否包含某一特定的列
- 判断一个数(x)是否是2的n次方
- 如何使用jQuery判断一个元素是否存在
- shell脚本使用两个数组,判断一个变量是否在数组里面的例子
- C#控制台循环判断输入的一个数是否为素数
- 判断一个文件是否正在被使用
- 判断一个链表是否有循环
- 判断一个数组是否为单一完全循环数组
- 不要用数组循环判断等于的方式,来判断一个对象是否在一个集合内
- 判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别