記錄兩個很妙的演算法
阿新 • • 發佈:2018-11-12
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); }