判断一个整数是否是2的N次方 单链表反转两个指针

题目:给定一个整数num,判断这个整数是否是2的N次方。比如,2,4,8是2的那次方,6,10不是2的N次方。

请看下面的程序:

public static bool Check1(int num){ int i = 1; while (true) { if (i > num) return false; if (i == num) return true; i = i * 2; }}

不断的循环num%2,如果不等于0,return false,如果等于0,num=num/2,一直做到num=1

public static bool Check2(int num){ if (num == 1) return true; else { do { if (num % 2 == 0) num = num / 2; else return false; } while (num != 1); return true; }}

其实这两种算法的思路都是相同的,但是第二种相对第一种更高效写,因为如果不是2的N次方,可以少循环很多次!

由于2的N次方的数二进制表示是第1位为1,其余为0,而x-1(假如x为2的N次方)得到的数的二进制表示恰恰是第1位为0,其余为1,两者相与,得到的结果就为0,否则结果肯定不为0。

public static boolean getResult(int num) { if (num <= 1) { return false; } else { return ((num & (num - 1)) == 0) ? true : false; } } public static void main(String[] args) { System.out.println(getResult(32)); }

上面的程序多判断了一个1. 我们知道, 1是2的0次方。 1应该是符合要求的。下面修正:
判断一个整数是否是2的N次方 单链表反转两个指针

public static bool floor_7(int num) { if (num <= 1) { return false; } else { return ((num & (num - 1)) == 0) ? true : false; } }

如果一个数是2的整数次幂,那么表示为二进制的时候会是这样:010000....

除了2的零次方,即1之外,这个数减一会得到:001111....

换言之得到一个前面全是0后面全是1的数,把这个数和原数做个按位与,得到:000000.....

换言之,如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂。因为只要他表达为二进制时存在两个1,就不会满足这条规律。所以最简判断方法就是:

if ( n < 0 )throw new InvalidOperationException();if ( n < 2 )return false;return n & ( n - 1 ) == 0

修正之后:

public bool floor_8(int n) { if (n < 0) throw new InvalidOperationException(); if (n < 2) return false; return n & (n - 1) == 0; }

对数算法:

bool foo(int x){ float ret = log(x)/log(2); return abs((int) ret - ret) <= 0.00001;}

修正后:

public bool floor_22(int x) { float ret = log(x) / log(2); return abs((int)ret - ret) <= 0.00001; }

对数算法比较有趣, 可惜, 浮点误差毕竟不是个容易避开的问题。因为浮点数不能直接比较, 所以用了一个0.00001来做尺度。这就存在了一个问题:当x很大的时候呢?我找了一个变态的数字来测试:0x10000001

结果是true。因为结果的小数部分实在是太小了。

static void Main(string[] args){int i = int.Parse(Console.ReadLine());Console.WriteLine(IsCheck(i));}public static bool IsCheck(int num){double result = Math.Log(num, 2);if (result.ToString().IndexOf(".") >= 0){return false;}else{return true;}}

相同的问题。 只要使用了LOG, 就无法避免掉浮点数丢精度的问题。 这是没办法的事情。

public static bool floor_37(int num) { double result = Math.Log(num, 2); if (result.ToString().IndexOf(".") >= 0) { return false; } else { return true; } }

所以总结了下, (x)&(x-1)的算法还没有被证明, 不知道除了0还有没有别的反例。因为毕竟这个算式没有严密的证明过程。

因此我觉得, 最保险的还是位运算, 看多少个1, 来的最实在。当然这里存在一个负数的问题。第一位是1, 剩下全是0的问题。 不过有一位聪明的回复者提供了一个很强大的方法来避开负数的用例:他给参数定的类型是uint!

好吧你赢了。

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/197726.html

更多阅读

matlab判断一个点是否在多面体内 matlab判断是否为数字

要在空位区域随机放置一定数量的原子,这些原子在空位区域任何一处存在的概念是相同的。空位区域是由包围这个空位周边的一些原子定义的。如果这个空位区域是一个标准的长方体,那么问题就比较简单,只需要产生随机数,然后再将随机数沿着基

戒烟的方法、戒烟症状 戒烟两个月后的症状

【戒烟的方法】如何戒烟(一):1.戒烟从现在开始,完全戒烟或逐渐减少吸烟次数的方法,通常3~4个月就可以成功。2.丢掉所有的香烟、打火机、火柴和烟灰缸。3.避免参与往常习惯吸烟的场所或活动。4.餐后喝水、吃水果或散步,摆脱饭后一支烟的想

幻想:家的N次方第二部剧情

期待第二部,栗子姐的表演很给力。。我小小的幻想一下剧情。。。。三年后。楚牧依旧忙活着自己的小农场,照看着两颗代表思念的栗子树,等待是他唯一能做的事;栗子姐一有空闲就会在大洋彼岸的电脑上看那个她日夜思念的人。。。两个人虽然彼

声明:《判断一个整数是否是2的N次方 单链表反转两个指针》为网友罪貪婪分享!如侵犯到您的合法权益请联系我们删除