兩個變量a,b,不用判斷語句,找出兩個中比較大的那個變量

法一:位運算ios

          

[cpp] view plaincopyprint?數組

  1. #include <iostream>  spa

  2.   

  3. using namespace std;  .net

  4.   

  5. int my_max(int x,int y)  code

  6. {  blog

  7.     int test[2]={x,y};  get

  8.     unsigned int c;  io

  9.   

  10.         c=x-y;  class

  11.           

  12.         c>>=31;  test

  13.         return test[c];  

  14. }  

  15. int main()  

  16. {  

  17.     int a=7,b=11;  

  18.    // cout<<my_max(a,b)<<endl;  

  19.     // int c=a-b;  

  20.     cout<<my_max(a,b)<<endl;  

  21.     system("pause");  

  22.     return 0;  

  23. }  

#include <iostream>

using namespace std;

int my_max(int x,int y)
{
	int test[2]={x,y};
	unsigned int c;

	    c=x-y;
		
		c>>=31;
	    return test[c];
}
int main()
{
	int a=7,b=11;
   // cout<<my_max(a,b)<<endl;
	// int c=a-b;
	cout<<my_max(a,b)<<endl;
	system("pause");
	return 0;
}

在my_max()中,經過對無符號數c右移31位,可得(a-b)的符號位,可知其爲正仍是爲負,這樣返回數組中相應的變量便可。

       注意:對於有符號位數的位移,當右移時:1 .最高位是1,即負數,那麼右移時不斷補1;  

                                                                                   2. 最高位是0,即正數,那麼右移時不斷補0;

                   對於無符號數的位移,當右移時:只補0;

      所以,題中的無符號整形數c右移便可獲得其符號位。


法二:

    

[cpp] view plaincopyprint?

  1. int max=((a+b)+abs(a-b))/2;  

  2. int  min=((a+b)-abs(a-b))/2;  

         int max=((a+b)+abs(a-b))/2;
         int  min=((a+b)-abs(a-b))/2;

         這種方法是算出來的,並不是像上面那樣找出來的,但在別的時候也許會用到,所以也許留意一下

相關文章
相關標籤/搜索