Re: 請問一個位元運算問題

看板Programming作者 (-858993460)時間13年前 (2010/12/02 04:17), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/13 (看更多)
※ 引述《modester@kkcity.com.tw (兄弟般的bf)》之銘言: : 最近在看程式的題目 : 看到有一題C語言 : 想向各位大大請益 : #include <stdio.h> : main() : { : int x = 3, y = 1, z = 3; : printf(“%d\n”, x ^ ~y & -z); : } : (假設運算子優先次序為[~, -]> & > ^。) : 我的想法是: : ~y = 1110;-z = -3 = 1011 : 之後~y & -z = 1010 : x ^(XOR) 1010 = 0011 ^ 1010 = 1001 = -1 : 後來用compiler編譯 : 發現答案沒錯 : 但發現以下問題 : 1. compiler編譯~y & -z = -4 : 但剛剛算出的結果是1010,難道1010 = -4? : 1010在這個例子中,應該是-2吧?(最高位代表負號) : 以上問題,有請高手解惑 : 感謝 現代電腦用的是二的補數 而不是 signed-magnitude 所以其實是這樣的: ~y = 1110 (-2) -z = 1101 (-3) ~y & -z = 1100 (-4) x ^ 1100 = 1111 (-1) 你這裡只是碰巧答案對而已 至於判斷二補數的負數是幾 利用 ~x == -x-1 這個關係 (這是二補數的定義, 加起來是 2^n-1) 也就是 -x == (~x)+1 因此 -z 就是從 0011 =(變補)=> 1100 =(加1)=> 1101 這個就是 -3 了 所以 1100 用一樣的方法 1100 =(變補)=> 0011 =(加1)=> 0100 是 4 於是 1100 就是 -4 -- ˊ_▂▃▄▂_ˋ. ◣          ▅▅ ▅▅ ι●╮   ./◤_▂▃▄▂_◥ \'▊   HARUHI █████ <■┘   ◤◤◥█◥◥█Δ   ISM    By-gamejye ¢|\   ▌▌ζ(▏●‵◥′●)Ψ ▏           █    ⊿Δ    /|▋ |\ ▎         ハルヒ主義      ▄█ ◥◥|◣ ‵′ ◢/'◢◢S.O.S 世界をいに盛り上げるための宮ハルヒの    -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.134
文章代碼(AID): #1Czgr5Uf (Programming)
討論串 (同標題文章)
文章代碼(AID): #1Czgr5Uf (Programming)