获得第二大的元素
#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; }
berkeleysong
posted on 2014-05-19 10:44 berkeleysong 阅读(180) 评论(0) 编辑 收藏 举报