以 __builtin 開頭的函數,是一種相當神奇的位運算函數,下面本人盤點了一下這些以 __builtin 開頭的函數,希望可以幫到大家。
用法:返回括號內數的二進位制表示數末尾0的個數
//eg: #include<bits/stdc++.h> using namespace std ; int main(){ cout << __builtin_ctz(8) << endl ; return 0 ; }
輸出:3
8 = 1000 , 末尾有3個0
用法:返回括號內數的二進位制表示數前導0的個數
//eg: #include<bits/stdc++.h> using namespace std ; int main(){ cout << __builtin_clz(8) << endl ; return 0 ; }
輸出:28
8 = 0000 0000 0000 0000 0000 0000 0000 1000 , 整型(int)為32位元,有28個前導0
換位long long後
#include<bits/stdc++.h> using namespace std ; int main(){ cout << __builtin_clzll(8) << endl ; return 0 ; }
輸出:60
長整型(long long)為64位元,有60個前導0
用法:返回括號內數的二進位制表示數1的個數
//eg: #include<bits/stdc++.h> using namespace std ; int main(){ cout << __builtin_popcount(15) << endl ; return 0 ; }
輸出:4
15 = 1111 , 1的個數位4
用法:判斷括號中數的二進位制表示數1的個數的奇偶性(偶數返回0 , 奇數返回1)
#include<bits/stdc++/h> using namespace std ; int main(){ cout << __builtin_parity(15) << endl ; return 0 ; }
輸出:0
15 = 1111, 1的個數為4(偶數個)
用法:返回括號中數的二進位制表示數的最後一個1在第幾位(從後往前算)
//eg: #include<bits/stdc++.h> using namespace std ; int main(){ cout << __builtin_ffs(8) << Lendl ; return 0 ; }
輸出:4
8 = 1000 , 最後一個1在第四位
7 __builtin_sqrtf( )
用法:快速開平方
//eg: #include<bits/stdc++.h> using namespace std ; int main(){ cout << __builtin_sqrt(16) << endl ; cout << __builtin_sqrtf(16) << endl ; cout << sqrt(16) << endl ; return 0 ; }
輸出:4
sqrt(16) = 4
那麼他們跟 sqrt() 有什麼區別呢?
做個小測試: 從到從1到108 比較耗時:
sqrt: 約 3700 ms
__builtin_sqrt( ): 約 330 ms
__bulitin_sqrtf( ): 約 360ms
快了接近10倍!
那麼這兩個函數的區別是什麼呢?
__builtin_sqrt( ) :8位元
__builtin_sqrtf( ) :4位元