NO.1 交换两个数
#include <iostream>
using namespace std;
void change_elem(int a,int b){
cout<<"a="<<a<<" b="<<b<<endl;
int v = a + b;
a = v - a;
b = v - a;
cout<<"交换后:a="<<a<<" b="<<b<<endl;
}
int main(){
int a=1,b=2;
change_elem(a,b);
}
NO.2 求最接近给定的数的2的倍数
这个算法比较复杂,我们这里给的数的int型也就是32位整数,我们的右移次数一共是1+2+4+8+16=31次,也就是说把所有的31位都移动过然后按位或了,当前给定数的最高位一定是1的,所以一定31位就是能覆盖所有的数了,溢出的数除外,假若32个1,然后加一那么变成0了,我们不考虑这种情况
//这个算法用来计算大于给定的一个int数的第一个2^n的那个数
void find_first(int v){
v += (v == 0); //如果是0的话那么先加成1
v--; //先减一
v |= v >> 1; //右移一位
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
cout<<"v="<<v<<endl;
}
int main(){
int v = 658;
find_first(v);
v = 0;
find_first(v);
v = 65535;
find_first(v);
}