实例六:绝对值

32位系统
方法:y=x>>31

     result=x^y-y;

x是要求绝对值的值,y为临时变量,result为x的绝对值。

一个负数右移31位后位-1;正数则为0;


为了方便 ,以8位位解释。


负数解释:
原数       1100 0011 ---- -3 方法中的x
移位31位    1100 0001 ---- -1 方法中的y
异或运算     0000 0010 ---- 2 方法中的x^y
减去y     1100 0001 ---- -1 方法中的y
结果       0000 0011 ---- 3 方法中的result


正数解释:
原数      0000 0011 ---- 3
移位31位   0000 0000 ---- 0
异或运算    0000 0011 ---- 3
减去y      0000 0000 ---- 0
结果      0000 0011 ---- 3

注意:两个负数的异或是正数,两个正数的异或仍然是正数。


代码:
int _tmain(int argc, _TCHAR* argv[])
{
  int x,y,nResult=0;
  cout << "请输入原始的值:";
  cin >> x;

  y = x >> 31;
  nResult = (x^y) - y;   //要加括号,算术运算符优先级高于位操作符
  cout <<endl<< "该数的绝对值:" << nResult;

  system("pause");
  return 0;
};