判断一个数是不是奇数

写代码似乎是先完成功能,后考虑优化,再看美观。

写出的一段代码怎么知道它的好不好呢?

最近发现个问题:如何判断一个数是不是奇数?

这个问题,很简单,1、3、5、7、9这些就是奇数,或者以这些数结尾的就是奇数,就是除2没法得到整数的数。

在计算机语言上,对2取模,判断一下就好了。
所以:

方法一

public class Demo_isOdd {
	public static boolean isOdd(int a) {
		boolean result;
		if (a % 2 == 1) {
			result = true;
		} else {
			result = false;
		}
		return result;
	}
	
	public static void main(String[] args) {
		boolean a = Demo_isOdd.isOdd(3);
		System.out.println("是奇数?  "+a);		
	}
}

问题解决 ! ?

传入1、2、3、4、5、6。。。这些数字,的确是做出了准确的判断。

如果传入一个负数呢?-1,-2,-3?

结果是出错了,说-1不是奇数。

上面的逻辑是最容易想到的一个方法,但是取模这个运算对负数操作后得到了-1,进而判断出错。

我们可以优化一下,还是对2取模,能整除的就是偶数,不能整除的就是奇数。并且还可以写的简洁一点,于是:

方法二

public class Demo_isOdd {
	public static boolean isOdd(int a) {
		return a % 2 != 0;
	}
	
	public static void main(String[] args) {
		boolean a = Demo_isOdd.isOdd(-3);
		System.out.println("是奇数?  "+a);		
	}
}

还能再有其他方法吗?
我们知道信息存储在计算机中都是二进制的01代码,数字也不例外。所以十进制的数字在计算机中保存的是二进制的格式,那么:

1----0001
2----0010
3----0011
4----0100
5----0101
6----0110
7----0111
8----1000
9----1001
……
很容易发现,偶数的末位是0,奇数的末位是1,那我们就可以使用移位运算符来进行操作:把一个数先向右移动一位,再向左移动一位。

第一次移动时,若数字是偶数,丢失的是0,第二次移动时补0,数值不会发生改变;
第一次移动时,若数字是奇数,丢失一位数字1,第二次移动时补0,数值发生改变,与原值相比少了1。

所以可以使用:

方法三

public class Demo_isOdd {
	public static boolean isOdd(int a) {
		return a >> 1 << 1 != a;
	}
	
	public static void main(String[] args) {
		boolean a = Demo_isOdd.isOdd(-3);
		System.out.println("是奇数?  "+a);		
	}
}

还是上面的二进制数值,可以知道数值的奇偶都是取决于最后一位数是0还是1,那能不能只研究最后一位就可以判断出数值的奇偶呢?

答案是可以。

将这个数与1进行与运算,数值前面的位会被1前面的0与运算变成0,而最后一位是0,结果就是0,为偶数;最后一位是1结果就是1,为奇数。
所以:

方法四

public class Demo_isOdd {
	public static boolean isOdd(int a) {
		return (a & 1) == 1;
	}
	
	public static void main(String[] args) {
		boolean a = Demo_isOdd.isOdd(-3);
		System.out.println("是奇数?  "+a);		
	}
}

结论

上面四个方法中,方法一是最容易想到的,也是最容易读懂的,但是传入负数时会出错,与方法二结合一下会写出更好的代码。

方法三、四是跟二进制有关,粗看之下可能会犯迷糊,但是细看还是可以看明白。

这个是近期看书逛论坛发现的,略有所感记录一下。

有没有更好的方法,欢迎各位指出。

你可能感兴趣的:(Java,java)