C/C++ __builtin 超實用位運算函數總結

2023-11-07 21:01:07

以 __builtin 開頭的函數,是一種相當神奇的位運算函數,下面本人盤點了一下這些以 __builtin 開頭的函數,希望可以幫到大家。

1 __builtin_ctz( ) / __buitlin_ctzll( )

用法:返回括號內數的二進位制表示數末尾0的個數

//eg:
#include<bits/stdc++.h>
using namespace std ;

int main(){
    cout << __builtin_ctz(8) << endl ;
    return 0 ;
}

 

輸出:3
8 = 1000 , 末尾有3個0

2 __buitlin_clz( ) / __buitlin_clzll( )

用法:返回括號內數的二進位制表示數前導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

3 __builtin_popcount( )

用法:返回括號內數的二進位制表示數1的個數

//eg:
#include<bits/stdc++.h>
using namespace std ;

int main(){
    cout << __builtin_popcount(15) << endl ;
    return 0 ;
}

 

輸出:4
15 = 1111 , 1的個數位4

4 __builtin_parity( )

用法:判斷括號中數的二進位制表示數1的個數的奇偶性(偶數返回0 , 奇數返回1)

#include<bits/stdc++/h>
using namespace std ;

int main(){
    cout << __builtin_parity(15) << endl ;
    return 0 ;
}

 

輸出:0
15 = 1111, 1的個數為4(偶數個)

5 __builtin_ffs( )

用法:返回括號中數的二進位制表示數的最後一個1在第幾位(從後往前算)

//eg:
#include<bits/stdc++.h>
using namespace std ;

int main(){
    cout << __builtin_ffs(8) << Lendl ;
    return 0 ;
}

 

輸出:4
8 = 1000 , 最後一個1在第四位

6 __builtin_sqrt( )

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位元