Java解惑閱讀筆記之1奇數性

之前一直都是看得多寫得少(其實基本就沒有寫過),在iteye,csdn都開過blog,可是都不多寫,感受貢獻太少,從今天起要開始努力了,將本身日常用到的,學到的以爲有意思的寫出來跟你們一塊兒分享,共同進步。 java

以前看過《Java Puzzlers》一書,以爲頗有意思,最近再翻一遍,將其中一些很tricky的東西作個筆記,與你們分享。都不是本身的原創,版權屬於原做者,這本書不錯,你們有興趣的話能夠買一本~http://book.douban.com/subject/1473329/ 測試

問題: code


public static boolean isOdd(int i) {
		return i % 2 == 1;
	}
能夠正確的判斷i的奇偶性麼?


正解: blog

不能夠,當i爲負數時候,i % 2 == -1,由於Java中對%的定義以下 get

(a / b) * b + (a % b) == a, it

可是Java的整數相除採用了截尾操做。正確代碼以下: class

public class Main1 {


 public static boolean isOdd(int i) {
 return i % 2 == 1;
 }
 public static boolean isOdd_2(int i) {
 return i % 2 != 0;
 }
 public static boolean isOdd_3(int i) {
 return (i & 1) != 0;
 }
 public static void main(String[] args) {
 //Java整數除法採用截尾操做,%運算知足:(a / b) * b + (a % b) == a,所以%的結果老是與作操做數(被除數)的符號一致
 System.out.printf("%d %d\n", 5 / 2, 5 % 2);
 System.out.printf("%d %d\n", -5 / 2, -5 % 2);
 System.out.printf("%d %d\n", 5 / (-2), 5 % (-2));
 System.out.printf("%d %d\n", 5 / (-2), 5 % (-2));
 
 System.out.println(isOdd(-11));
 System.out.println(isOdd_2(-11));
 System.out.println(isOdd_3(-11));
 
 int N = 1000000;
 long start = System.currentTimeMillis();
 for (int i = 0; i < N; i++) {
 isOdd_2(i);
 }
 long end = System.currentTimeMillis();
 System.out.printf("isOdd_2 takes: %d\n", end - start);
 start = System.currentTimeMillis();
 for (int i = 0; i < N; i++) {
 isOdd_3(i);
 }
 end = System.currentTimeMillis();
 System.out.printf("isOdd_3 takes: %d \n", end - start);
 }
}
經過測試能夠發現,&比%快了很多,所以最好的方法是isOdd_3,速度快,並且不影響代碼可讀性~
相關文章
相關標籤/搜索