1. 程式人生 > >記錄兩個很妙的演算法

記錄兩個很妙的演算法

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);
}