Re: 請問一個位元運算問題
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 13 篇):