先上代碼段
static int pow2gt (int x)
{
--x;
x|=x>>1;
x|=x>>2;
x|=x>>4;
x|=x>>8;
x|=x>>16;
return x+1;
}
這段代碼是取任意一個數字的最小2的N次冪,因爲計算機內存是以二進制來存儲的,因此在一些內存申請中可以簡化,並且可以運用到其他的方面。
先看原理介紹。–x 和 末尾的 x+1可以防止溢出(個人認識),x|x>>1;是將x轉化爲二進制然後向右移動位數(這裏移動一位),然後取或運算符,可以將其設置爲1最後可以得到從1開始的數字。這是二進制運算中的按或運算符,接下來以2147483648爲例(–x後得到的數字),2147483648在計算機中以二進制儲存是10000000 00000000 00000000 00000000 (int爲四字節,因此有32位),
11000000 00000000 00000000 00000000 x|x>>1
11110000 00000000 00000000 00000000 x|x>>2
11111111 00000000 00000000 00000000 x|x>>4
11111111 11111111 00000000 00000000 x|x>>8
11111111 11111111 11111111 11111111 x|x>>16
``因爲二進制轉化爲十進制是通過冪來累加的,這樣可以做到最高位後的所有位數都爲1,即最終結果得到了大於2的最小二次冪。如果有興趣的讀者可以自己實踐實踐,例如代入4,5,6進行求最終結果,會發現這是非常奇妙的`
若有一些不正確的地方歡迎大家批評指正。