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 即可,最快的办法就是使用 &
提取二进制的最低位来判断。
尾声
经过这次事件后,对小白的触发挺大的。虽然上面的程序不能完全说清楚就是初级、中级和高级的区分,但至少从思路上来说,初级、中级、高级的区分还是很明显的。