Java解惑之奇数性————《Java解惑》有感+笔记
当我们要判断一个数是否为奇数时我们经常会写以下代码
1: public static boolean isOdd(int i)
2: {
3: return i%2==1;
4: }
但是当i为负奇数的时候,i%2返回值为-1不是1,所以当i为负数的时候函数的返回值都是false。
原因在于,Java对取余操作符的定义为
对所有int数值a和所有非零int数值b,都满足以下恒等式
(a/b)*b+(a%b)==a
很明显,a%b取余后的数必须和a一样的符号才能满足以上等式。
所以,在Java中i%2==1 不等于i%2!=0;
因此,在java中你可以这样判断一个数是不是奇数,只要判断他不是偶数就可以了
1: public static boolean isOdd(int i)
2: {
3: return (i%2)!=0;
4: }
当然这还有更好的办法,你可以用与符号来完成判断是否为一个偶数或者奇数
1: public static boolean isOdd(int i)
2: {
3: return (i&1)==1;
4: }
原理是奇数用二进制表示最后一位总是1,当和1与操作的时候就剩下最后一位为1了
偶数也是同样道理,我就不多说了,这种算法比上面取余的算法要快一点(毕竟计算
机比较喜欢使用逻辑运算的,不信的话可以自己验证一下,我把我的验证代码也贴出来一下),
1: public class MainClass
2: {
3: public static void main(String[] args)
4: {
5: for (int j = 0; j < 100000000; j++){}//不写这个的话,第二个运行的总会比第一个块,其实就是让它稳定后再测试
6: final int time = 1999999999;
7: // Scanner s = new Scanner(System.in);
8: long startTime = System.nanoTime();
9: for (int i = 0; i < time; i++)
10: {
11: isOdd(i);
12: }
13:
14: long endTime = System.nanoTime();
15:
16: System.out.println(endTime - startTime);
17: long startTime2 = System.nanoTime();
18:
19:
20: for (int i = 0; i < time; i++)
21: {
22: isOdd2(i);
23: }
24: long endTime2 = System.nanoTime();
25: System.out.println(endTime2 - startTime2);
26: }
27:
28: public static boolean isOdd(int i)
29: {
30: return (i & 1) != 0;
31: }
32:
33: public static boolean isOdd2(int i)
34: {
35: return (1 % 2) != 0;
36: }
37:
38: }
并且符合计算机的思维所以我推荐使用最后一种的方法。这个问题同样在C++也是会出现的,这里就不多说了