1. 程式人生 > >如何高效地判斷奇數和偶數

如何高效地判斷奇數和偶數

在我們日常的程式設計當中,常常會遇到判斷某個整數屬於奇數還是偶數的情況。

大家一般的處理做法是用這個整數和2取模。然後判斷是等於1還是等於0。

這裡,我要為大家介紹一種快速有效的判斷做法,利用2進位制進行判斷。

大家都知道,奇數的最低位一定是1,而偶數的最低位一定是0.所以我們可以根據這個特性,讓需要判定的整數和1進行“與”運算,這樣就只留下了原數的最低位,然後直接判斷這個數等於1還是等於0即可。

實現程式碼如下:

  1. class Program
  2. {
  3. staticvoid Main(string[] args)
  4.     {
  5. bool s = OddEven.IsEven(4);
  6.         Console.WriteLine(s);
  7.         s = OddEven.IsOdd(55877554);
  8.         Console.WriteLine(s);
  9.     }
  10. }
  11. /// <summary>
  12. /// 判斷一個整數是奇數還是偶數。
  13. /// </summary>
  14. class OddEven
  15. {
  16. staticprivateint s = 1;
  17. staticpublicbool IsEven(int a)
  18.     {
  19. if ((a & s) == 0)
  20.         {
  21. returntrue;
  22.         }
  23. else
  24.         {
  25. returnfalse;
  26.         }
  27.     }
  28. staticpublicbool IsOdd(int a)
  29.     {
  30. return !IsEven(a);
  31.     }
  32. }
首先,我也比較相信位運算的效率比取模更高,但樓主既然提出了這種方式比模運算更高效的觀點,為什麼不提供效能測試資料來支援你的觀點呢?這就不夠嚴謹了。 

另外,
  1. if ((a & s) == 0)
  2. {
  3. returntrue;
  4. }
  5. else
  6. {
  7. returnfalse;
  8. }
為什麼不可以寫成
return ((a & s) ==0);

呢?這樣雖然從效能的角度來看變化不大,但至少可以讓程式看上去更簡潔精煉,畢竟這種簡潔並不會損失可讀性呀。
用擴充套件方法更好,不需要 OddEven 這個類。
  1. using
     System;
  2. namespace IsEven
  3. {
  4. class Program
  5.     {
  6. staticvoid Main(string[] args)
  7.         {
  8.             Console.WriteLine(3.IsEven());
  9.             Console.ReadLine();
  10.         }
  11.     }
  12. publicstaticclass IntExtensions
  13.     {
  14. publicstaticbool IsEven(thisint i)
  15.         {
  16. return (i & 1) == 0;
  17.         }
  18.     }
  19. }
轉自:http://www.chenjiliang.com/Article/View.aspx?ArticleID=5215&TypeID=34