首页 > 代码库 > 获得第二大的元素

获得第二大的元素

#include<iostream>
using namespace std;

int main()
{
 int s1 = 1;
 unsigned int s2 = 1;

 cout<<(s1<<31)<<endl; ///这是把i左移两位,左移的规则只记住一点:丢弃符号位,0补最低位!如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位。
 cout<<(s2<<31)<<endl;///左移的话,有符号与符号都是一致的 2147483648

 // 右移有两种,算术右移(带符号)>>和逻辑右移(不带符号)>>>。
 //算术右移:符号位不变,左边补上符号位。如: 1000 1000 >> 3 为 1111 0001
 //逻辑右移:符号位一起移动,左边补上0。如:1000 1000 >>> 3 为 0001 0001
//
// 在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移)。 
//而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!
}

 

#include<iostream>
#include<algorithm>
#include<numeric>
using namespace std;

bool helper(const int a[],const int n, int &max, int &min)
{
   max = std::max(a[0],a[1]); ///引用可以改变引用对象吗,这是个值得疑问的问题
   min = std::min(a[0],a[1]);
   for(int i = 2;i< n - 1 ; i = i+2) ///小心,这里面以2为step,是陷阱呀
   {
    int tmax = std::max(a[i],a[i+1]);///用标准库函数的话,就不是1.5了,就当练习了
    int tmin = std::min(a[i],a[i+1]);

    max = std::max(max,tmax);
    min = std::min(min,tmin);
   }

   max = std::max(max,a[n-1]);
   min = std::min(min,a[n-1]);
   return true;
}

int main()
{
    int a[] = {1,2,3,2,4,5,6,7,8,5,3};
    int max,min;
    helper(a,sizeof(a)/sizeof(a[0]),max,min);
    cout<<max<<" "<<min<<endl;

}