如何判断用户输入的一个整数是否为2的整数幂

    判断一个整数是否为2的整数幂,最容易想到的办法就是将这个数一直除以2,然后判断除以2后得到的数属否等于1,但是在c#中,3除以2得到的结果也是1,5除以2得到的结果是2,再除以一次2的结果也是1,所以这个方法实际上是行不通的。

    但是如果我们把用户输入的整数先转换为double类型,double类型在使用除法时能得到更精确的double数,所以可以通过结果与1的比较,判断用户输入的数字是否为2的整数幂,具体实现代码如下:

 

 

    上面的代码确实可以实现要求,但是我们不禁会想,如果用户输入的是一个非常大的数字,结果不言而喻,计算机会每次除以2时,都会进行判断,显然这么做出来的程序效率低下。在网上看了一下,有一种简单的办法,我们在学计算机基础的时候都会知道,计算机保存的所有对象都是以二进制的形式表示,在c#中,定义int类型为8位4个字节来表示,比方说整数3,在计算机中表示则为“00000011”,通过这种保存机制我们可以很快发现,所有2的整数幂的数字在使用二进制表示时有且仅有一位上为1,其他位上均为0。

    发现了这个规律,剩下的事情我们就好解决了,有两种方法可以解决,第一种是将用户输入的数字转化为二进制,将二进制转化为字符串后查找串中1的个数,如果只有1个,则用户输入的数为2的整数幂,否则不是。另外一个方法涉及到c#中的数的位运算,举个例子,一个2的整数幂数字表示为“00001000”,那么这个数的值为2的3次方等于8,“00000111”等于7,也就是说,如果用户输入的整数为2的整数次幂,这个数减去1后得到的数用二进制表示就是用户输入整数的1所在的最高位变为0,后面的位全部为1,所以这里我们无论是使用与运算还是或运算,都可以判断用户输入的数是否为2的整数次幂。如果使用或运算,得到的结果是两个数的和,如果使用与运算,结果为0。实现代码如下(试用与运算):

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值