These are four important built-in functions in GCC compiler:
1. __builtin_popcount(x)
This function is used to count the number of one’s(set bits) in an integer.
Example:
if x = 4 binary value of 4 is 100 Output: No of ones is 1.
// C program to illustrate _builtin_popcount(x) #include <stdio.h> int main()
{ int n = 5;
printf ( "Count of 1s in binary of %d is %d " , n,
__builtin_popcount(n));
return 0;
} |
// C++ program to illustrate _builtin_popcount(x) #include <bits/stdc++.h> using namespace std;
int main()
{ int n = 5;
cout << "Count of 1s in binary of " << n << " is " << __builtin_popcount(n);
return 0;
} |
Count of 1s in binary of 5 is 2
Time complexity : O(log2(n))
Auxiliary Space: O(1)
Note: Similarly you can use __builtin_popcountl(x) & __builtin_popcountll(x) for long and long long data types.
2 . __builtin_parity(x)
This function is used to check the parity of a number. This function returns true(1) if the number has odd parity else it returns false(0) for even parity.
Example:
if x = 7 7 has odd no. of 1's in its binary(111). Output: Parity of 7 is 1
// C program to illustrate _builtin_parity(x) #include <stdio.h> int main()
{ int n = 7;
printf ( "Parity of %d is %d " ,
n, __builtin_parity(n));
return 0;
} |
// C++ program to illustrate _builtin_parity(x) #include <bits/stdc++.h> using namespace std;
int main()
{ int n = 7;
cout << "Parity of " << n << " is " << __builtin_parity(n);
return 0;
} |
Parity of 7 is 1
Time complexity : O(log2(n))
Auxiliary Space: O(1)
Note: Similarly you can use __builtin_parityl(x) & __builtin_parityll(x) for long and long long data types.
3.__builtin_clz(x)
This function is used to count the leading zeros of the integer. Note : clz = count leading zero’s.
Example: It counts number of zeros before the first occurrence of one(set bit).
a = 16 Binary form of 16 is 00000000 00000000 00000000 00010000 Output: 27
// C program to illustrate __builtin_clz(x) #include <stdio.h> int main()
{ int n = 16;
printf ( "Count of leading zeros before 1 in %d is %d" ,
n, __builtin_clz(n));
return 0;
} |
// C++ program to illustrate __builtin_clz(x) #include <bits/stdc++.h> using namespace std;
int main()
{ int n = 16;
cout<< "Count of leading zeros before 1 in " << n << " is " <<__builtin_clz(n);
return 0;
} |
Count of leading zeros before 1 in 16 is 27
Time complexity : O(log2(n))
Auxiliary Space: O(1)
Note: __builtin_clz(x) This function only accept unsigned values
Note: Similarly you can use __builtin_clzl(x) & __builtin_clzll(x) for long and long long data types.
4.__builtin_ctz(x)
This function is used to count the trailing zeros of the given integer. Note : ctz = count trailing zeros.
Example: Count no of zeros from last to first occurrence of one(set bit).
a = 16 Binary form of 16 is 00000000 00000000 00000000 00010000 Output: ctz = 4
// C program to illustrate __builtin_ctz(x) #include <stdio.h> int main()
{ int n = 16;
printf ( "Count of zeros from last to first "
"occurrence of one is %d" ,
__builtin_ctz(n));
return 0;
} |
// C++ program to illustrate __builtin_ctz(x) #include <bits/stdc++.h> using namespace std;
int main()
{ int n = 16;
cout<< "Count of zeros from last to first occurrence of one is " << __builtin_ctz(n);
return 0;
} |
Count of zeros from last to first occurrence of one is 4
Time complexity : O(log2(n))
Auxiliary Space: O(1)
Note: Similarly you can use __builtin_ctzl(x) & __builtin_ctzll(x) for long and long long data types.