作者LPH66 (-858993460)
看板Programming
标题Re: 请问一个位元运算问题
时间Thu Dec 2 04:17:07 2010
※ 引述《[email protected] (兄弟般的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