C++ 位運算黑科技,學會了,再也不寫循環(huán)了!

代碼:
bool is_power_of_2(uint n)
{
return (n != 0) && ((n & -n) == n);
}
用途:要求數(shù)值大小必須是二的冪次的場合,比如伙伴內(nèi)存分配算法分配的內(nèi)存塊大小。
?
01:15
?一個數(shù)是二的冪次 (power of 2) 的二進制比特特征:序列里只有一個 1。
?
01:50
?可用特定編譯工具鏈的內(nèi)建擴展,如 gcc 的 __builtin_popcount() 得到一個整數(shù)里有多少個 1。
0 不是 2 的冪次。
?
02:55
?一個數(shù)與其相反數(shù)的按位與 n & -n
結(jié)果是 n 的最右端置的 1。
補碼 (2's complement) -n = ~n + 1
-n 的比特性質(zhì):設(shè) n = bbb100...0,-n 會保持最右端的連續(xù) 0 子序列及左邊的第一個 1,即保持右端的 100...0 模式,而左端的 bbb 全部按位取反。從左至右看,也就是最右端的 1 及后面的 0 被保持。
所以,n & -n 中按位與會將除了右端 100...0 模式之外的,全部歸為 0,因此它的結(jié)果就是右端的 100...0 序列。而這個序列里只有一個 1,它是二的冪次。
最終,判斷 n 是不是二的冪次,就可以表示為 n == (n & -n)
標簽: