众所周知,在整数中,能被2等分的数叫偶数,不能被2等分的数叫奇数。因此,判断一个数的奇偶性,我们总是用2除,看是否有余数。那么有没有更先进的方法呢?
学过计算机二进制的朋友应该都知道or (|),and(),non(!),如0 | 0=0,00=0,0| 1=1,01=0,1| 1=1,11=1。在任何奇数二进制表示中,第一位必须是1,例如,二进制3是00000011,二进制5是0000101,二进制7是0000111。相反,偶数的第一位必须是0,所以如果是偶数,结果必须是0,例如偶数2,000,001。那么,我们可以据此判断。
有人可能会说,这有什么用?把简单的问题复杂化没有意义。其实对我们来说真的意义不大,但对计算机来说意义很大,因为计算机的内部算法是这样的。即使我们用数字除以2来判断,编译后的计算机仍然会这样做。所以如果直接跳过中间一步,用方法直接判断,就可以省去下一步,对于运算量大的计算机来说,仍然有很大的现实意义。为此,我还专门写了一个程序,看看这两种算法下计算1000次、10000次、100000次甚至1000000次需要多少时间。代码如下。
直接粘贴代码:
公共类MyTest {
/**
*比较两种判断奇偶的方法的执行效率。
* @param计数执行次数
* @param numberSize生成的随机数的数量
*/
公共静态void比较(int count,int NumberSize){ 0
long tt1=long . value of(0);
long tt2=long . value of(0);
设置数字集;
for(int I=0;我数;I){ 0
//获取指定数量的随机数
number set=random number(NumberSize);
system . out . println(" th "(I ^ 1)"第次执行:");
long t1=system . CurrentMemillis();
法官编号(号码集);
long T2=system . CurrentMemillis();
tt1=(T2-t1);
long T3=system . CurrentMemillis();
法官编号1(数字集);
long T4=system . CurrentMemillis();
tt2=(T4-T3);
}
System.out.println (' nAverage第一个方法的时间:“(float)tt1/count ' ms ');
System.out.println("第二种方法的平均时间:"(浮点)tt2/计数毫秒");
}
//生成指定数量的随机数
公共静态SetInteger randomNumber(int NumberSize){ 0
Random Random=new Random();
int n=0;
SetInteger number set=new HashSet();
for(int I=0;I整数。最大值;I){ 0
if(NumBerSet . SiZe)(NumBerSiZe){ 0
number set . add(random . nextint());
} else {
打破;
}
}
返回数字集;
}
//判断奇偶数
公共静态无效法官人数(设置整数人数设置){ 0
int n1=0,N2=0;
for(整数: numberset){ 0
if((数字0x 01)==0){ 0
n1;
} else {
N2;
}
}
System.out.println("第一种方法偶数的个数是:" + n1 + "tt奇数的个数是:" + n2);
}
// 判断奇偶数
public static void judgeNumber1(Set<Integer> numberSet) {
int n1 = 0,n2 = 0;
for (Integer number:numberSet) {
if ((number % 2) == 0) {
n1++;
} else {
n2++;
}
}
System.out.println("第二种方法偶数的个数是:" + n1 + "tt奇数的个数是:" + n2);
}
public static void main(String[] args) {
compare(10, 1000000);
}
}
首先我判断一千次的耗时,执行十次,算出平均耗时,结果如下:
第1次执行:
第一种方法偶数的个数是:519 奇数的个数是:481
第二种方法偶数的个数是:519 奇数的个数是:481
第2次执行:
第一种方法偶数的个数是:512 奇数的个数是:488
第二种方法偶数的个数是:512 奇数的个数是:488
第3次执行:
第一种方法偶数的个数是:486 奇数的个数是:514
第二种方法偶数的个数是:486 奇数的个数是:514
第4次执行:
第一种方法偶数的个数是:500 奇数的个数是:500
第二种方法偶数的个数是:500 奇数的个数是:500
第5次执行:
第一种方法偶数的个数是:482 奇数的个数是:518
第二种方法偶数的个数是:482 奇数的个数是:518
第6次执行:
第一种方法偶数的个数是:506 奇数的个数是:494
第二种方法偶数的个数是:506 奇数的个数是:494
第7次执行:
第一种方法偶数的个数是:478 奇数的个数是:522
第二种方法偶数的个数是:478 奇数的个数是:522
第8次执行:
第一种方法偶数的个数是:528 奇数的个数是:472
第二种方法偶数的个数是:528 奇数的个数是:472
第9次执行:
第一种方法偶数的个数是:496 奇数的个数是:504
第二种方法偶数的个数是:496 奇数的个数是:504
第10次执行:
第一种方法偶数的个数是:514 奇数的个数是:486
第二种方法偶数的个数是:514 奇数的个数是:486
第一种方法平均耗时:1.6 ms
第二种方法平均耗时:1.0 ms
然后我判断一万次的耗时,执行十次,算出平均耗时,结果如下:
第1次执行:
第一种方法偶数的个数是:4946 奇数的个数是:5054
第二种方法偶数的个数是:4946 奇数的个数是:5054
第2次执行:
第一种方法偶数的个数是:4936 奇数的个数是:5064
第二种方法偶数的个数是:4936 奇数的个数是:5064
第3次执行:
第一种方法偶数的个数是:4977 奇数的个数是:5023
第二种方法偶数的个数是:4977 奇数的个数是:5023
第4次执行:
第一种方法偶数的个数是:5004 奇数的个数是:4996
第二种方法偶数的个数是:5004 奇数的个数是:4996
第5次执行:
第一种方法偶数的个数是:5072 奇数的个数是:4928
第二种方法偶数的个数是:5072 奇数的个数是:4928
第6次执行:
第一种方法偶数的个数是:4914 奇数的个数是:5086
第二种方法偶数的个数是:4914 奇数的个数是:5086
第7次执行:
第一种方法偶数的个数是:4962 奇数的个数是:5038
第二种方法偶数的个数是:4962 奇数的个数是:5038
第8次执行:
第一种方法偶数的个数是:5077 奇数的个数是:4923
第二种方法偶数的个数是:5077 奇数的个数是:4923
第9次执行:
第一种方法偶数的个数是:5006 奇数的个数是:4994
第二种方法偶数的个数是:5006 奇数的个数是:4994
第10次执行:
第一种方法偶数的个数是:4940 奇数的个数是:5060
第二种方法偶数的个数是:4940 奇数的个数是:5060
第一种方法平均耗时:3.5 ms
第二种方法平均耗时:2.3 ms
判断十万次的耗时,执行十次,算出平均耗时,结果如下:
第1次执行:
第一种方法偶数的个数是:49929 奇数的个数是:50071
第二种方法偶数的个数是:49929 奇数的个数是:50071
第2次执行:
第一种方法偶数的个数是:49893 奇数的个数是:50107
第二种方法偶数的个数是:49893 奇数的个数是:50107
第3次执行:
第一种方法偶数的个数是:49932 奇数的个数是:50068
第二种方法偶数的个数是:49932 奇数的个数是:50068
第4次执行:
第一种方法偶数的个数是:49898 奇数的个数是:50102
第二种方法偶数的个数是:49898 奇数的个数是:50102
第5次执行:
第一种方法偶数的个数是:50004 奇数的个数是:49996
第二种方法偶数的个数是:50004 奇数的个数是:49996
第6次执行:
第一种方法偶数的个数是:50019 奇数的个数是:49981
第二种方法偶数的个数是:50019 奇数的个数是:49981
第7次执行:
第一种方法偶数的个数是:49881 奇数的个数是:50119
第二种方法偶数的个数是:49881 奇数的个数是:50119
第8次执行:
第一种方法偶数的个数是:50004 奇数的个数是:49996
第二种方法偶数的个数是:50004 奇数的个数是:49996
第9次执行:
第一种方法偶数的个数是:49899 奇数的个数是:50101
第二种方法偶数的个数是:49899 奇数的个数是:50101
第10次执行:
第一种方法偶数的个数是:50066 奇数的个数是:49934
第二种方法偶数的个数是:50066 奇数的个数是:49934
第一种方法平均耗时:8.5 ms
第二种方法平均耗时:8.8 ms
我判断一百万次的耗时,执行十次,算出平均耗时,结果如下:
第1次执行:
第一种方法偶数的个数是:499904 奇数的个数是:500096
第二种方法偶数的个数是:499904 奇数的个数是:500096
第2次执行:
第一种方法偶数的个数是:500172 奇数的个数是:499828
第二种方法偶数的个数是:500172 奇数的个数是:499828
第3次执行:
第一种方法偶数的个数是:499950 奇数的个数是:500050
第二种方法偶数的个数是:499950 奇数的个数是:500050
第4次执行:
第一种方法偶数的个数是:499937 奇数的个数是:500063
第二种方法偶数的个数是:499937 奇数的个数是:500063
第5次执行:
第一种方法偶数的个数是:499896 奇数的个数是:500104
第二种方法偶数的个数是:499896 奇数的个数是:500104
第6次执行:
第一种方法偶数的个数是:499992 奇数的个数是:500008
第二种方法偶数的个数是:499992 奇数的个数是:500008
第7次执行:
第一种方法偶数的个数是:500145 奇数的个数是:499855
第二种方法偶数的个数是:500145 奇数的个数是:499855
第8次执行:
第一种方法偶数的个数是:499907 奇数的个数是:500093
第二种方法偶数的个数是:499907 奇数的个数是:500093
第9次执行:
第一种方法偶数的个数是:499958 奇数的个数是:500042
第二种方法偶数的个数是:499958 奇数的个数是:500042
第10次执行:
第一种方法偶数的个数是:500116 奇数的个数是:499884
第二种方法偶数的个数是:500116 奇数的个数是:499884
第一种方法平均耗时:59.7 ms
第二种方法平均耗时:70.7 ms
可以看到,当判断次数为一千次和一万次的时候,第一种方法甚至比第二种方法耗时更久,直到判断次数达到十万次的时候,第一种方法的优势才开始慢慢显露出来,判断一百万次的时候直接耗时少了十多毫秒。