ROUND 1
public class TestOdd { public static void main(String[] args) { int oddNum=153; System.out.println(isOdd(oddNum)); int evenNum=9284; System.out.println(isOdd(evenNum)); } public static boolean isOdd(int i){ return i % 2 == 1; } }
小白:奇数(odd)指不能被 2 整除的数 ,数学表达形式为:2k+1,因此我就写了一个方法,根据求余之后的值是否为 1 来判断。
接下来轮到小王的程序了。
ROUND 2
public class TestOdd { public static void main(String[] args) { /** * A constant holding the minimum value an {@code int} can * have, -2<sup>31</sup>. @Native public static final int MIN_VALUE = 0x80000000; * A constant holding the maximum value an {@code int} can * have, 2<sup>31</sup>-1. @Native public static final int MAX_VALUE = 0x7fffffff; */ int oddNum=Integer.MAX_VALUE; System.out.println(isOdd(oddNum)); int evenNum=Integer.MIN_VALUE; System.out.println(isOdd(evenNum)); } public static boolean isOdd(int i){ return i % 2!=0;//如果一个数是偶数,就算是负数整除2余数也为0 } }
小王:因为 int 的整数范围为 -2^{31}−231 ~2^{31}-1231−1 ,即在所有的 int 数值中,有一半都是负数,如果 i 为负数,所有的求余都是负数,不会等于 1,例如 i=-5,i%2=-1。所以考虑正负整数的情况下,i 需要满足求余不等于 0。
接下来轮到扫地僧的程序了。
ROUND 3
public class TestOdd { public static void main(String[] args) { /** * A constant holding the minimum value an {@code int} can * have, -2<sup>31</sup>. @Native public static final int MIN_VALUE = 0x80000000; * A constant holding the maximum value an {@code int} can * have, 2<sup>31</sup>-1. @Native public static final int MAX_VALUE = 0x7fffffff; */ int oddNum=Integer.MAX_VALUE; System.out.println(isOdd(oddNum)); int evenNum=Integer.MIN_VALUE; System.out.println(isOdd(evenNum)); } public static boolean isOdd(int i){ return (i & 1)!=0;//1的十六进制为0x00000001,本质是取二进制的最后一位的值 } }
扫地僧:不管 int 的数据是怎么样子的,它在计算机里都是二进制表示,想要判断是否为 0,根据二进制的特点 (2^n2n+…+2^020 ),只需要看看二进制的 最后一位 是 1, 还是 0 即可,最快的办法就是使用 & 提取二进制的最低位来判断。
尾声
经过这次事件后,对小白的触发挺大的。虽然上面的程序不能完全说清楚就是初级、中级和高级的区分,但至少从思路上来说,初级、中级、高级的区分还是很明显的。