[問題] 使用位元運算判斷奇數偶數

看板C_and_CPP作者 (峰)時間15年前 (2009/10/30 17:53), 編輯推噓5(5019)
留言24則, 11人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: 使用位元運算的方式來判斷輸入之整數為奇數或是偶數, 其中使用if函數來判斷的時候發生問題。 希望得到的正確結果: 奇數跑odd、偶數跑even 程式跑出來的錯誤結果: 不管是奇數還是偶數都跑出odd 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++ 有問題的code: (請善用置底文標色功能) 01 int main(void) 02 { 03 int a,b,c; 04 b = 0; 05 printf("Input num:"); 06 scanf(" %d",&a); 07 putchar('\n'); 08 c=a|b; 09 if(c==0) 10 printf("Num:%d is even.\n",a); 11 else 12 printf("Num:%d is odd.\n",a); 13 system("PAUSE"); 14 return 0; 15 } 如果將09行改成c==1且10跟12的even、odd調換,那麼會有正確的結果。 但是我想不通為什麼照上面這樣子會發生錯誤。 補充說明: 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.120.222.65

10/31 02:09, , 1F
就算改了第九行 結果也還是錯的吧
10/31 02:09, 1F

10/31 02:16, , 2F
c = a|0 #=> c = a
10/31 02:16, 2F

10/31 02:17, , 3F
這樣為什麼會錯?? 任何數 | 0還是等於原值吧??
10/31 02:17, 3F

10/31 02:19, , 4F
另外同1F, 照你寫的換還是錯的, 請複習位元運算子:)
10/31 02:19, 4F

10/31 02:20, , 5F
順便思考一下奇數與偶數的特性, 你才知道該如何下位元
10/31 02:20, 5F

10/31 02:20, , 6F
運算以求奇偶數; 這題還可以延伸, 用位元運算判斷負數XD
10/31 02:20, 6F

10/31 07:09, , 7F
觀察 20->10100,21->10101,22->10110,23->10111,24->11000
10/31 07:09, 7F

10/31 09:31, , 8F
要用AND...
10/31 09:31, 8F

10/31 12:02, , 9F
可是如果使用and,那1 AND 0跟0 AND 0不是都會變成0嗎
10/31 12:02, 9F

10/31 12:03, , 10F
那這樣用if不就無法判斷了嗎?
10/31 12:03, 10F

10/31 12:08, , 11F
if( a & 1 )
10/31 12:08, 11F

10/31 12:15, , 12F
我意思是說如果a是奇數或偶數都會讓c是0,那程式不就
10/31 12:15, 12F

10/31 12:15, , 13F
無法判斷了嗎
10/31 12:15, 13F

10/31 12:20, , 14F
c = a & 1 ??
10/31 12:20, 14F

10/31 12:31, , 15F
如果c=a&1,那那不就變成跟上面一樣,等同於c=a嗎
10/31 12:31, 15F

10/31 12:33, , 16F
c=a&0,若a=1,c=0若a=0,c=0,也會變成無論奇偶都是0
10/31 12:33, 16F

10/31 12:33, , 17F
這樣程式不就無法判斷了嗎
10/31 12:33, 17F

10/31 12:34, , 18F
c=a&1 只會取到最後一個bit 不等同於c=a ...
10/31 12:34, 18F

10/31 12:38, , 19F
你要不要自己在紙上算一下...
10/31 12:38, 19F

10/31 13:05, , 20F
所以說建議你把位元運算子複習一下, 像樓上說的拿紙筆先
10/31 13:05, 20F

10/31 13:05, , 21F
算一算會比較好....
10/31 13:05, 21F

10/31 14:08, , 22F
為什麼要這樣做... %2會自動被最佳化...
10/31 14:08, 22F

11/01 21:49, , 23F
a&1 是2進位的一個一個位元做AND 所以如果是奇數
11/01 21:49, 23F

11/01 21:50, , 24F
最後一位元 就是1&1 偶數則是0&1 在自己設判斷就OK了
11/01 21:50, 24F
文章代碼(AID): #1AwoWpV4 (C_and_CPP)