While solving Andrew Stankevich Contest 32, Problem K, I noticed that __builtin_popcount for long long doesn't work properly, I spent a lot of time to find my mistake, but when I wrote __builtin_popcount by myself it accepted.
__builtin_popcount defined only for int?
thank you very much, Now I will use it in right condition.
What is long int type?
http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c
can __builtin_popcount work for unsigned long long ???
Nope, use
__builtin_popcountll
okk thanks
What is " __builtin_popcount"? I found something. But I couldn't find all of them :(
Funny — I could. http://lmgtfy.com/?q=popcount
About the 3rd result from the top says "popcount returns the number of non-zero bits in x".
It is easy to find what popcount do. But I couldn't find complexity, C++ or C++11, parameters, and works for any compiler? Also I couldn't find it on cplusplus.com .
Okay, you just said you couldn't find anything.
I changed my reply. But still I don't know "complexity, C++ or C++11, parameters, and works for any compiler?"...
__builtin_popcount(x) is a function in C++ returns the number of 1-bits set in an int x. In fact, "popcount" stands for "population count," so this is a function to determine how "populated" an integer is.
For example, say we have an int x with value equal to 12. 12 in binary is just 1100, and the rest of the digits are just 0's. So, __builtin_popcount(12) = 2.
Interesting fact : __builtin_popcount is slow. Can anyone tell the complexity? For a constant time bitcount use this : http://pastie.org/9412225 .Please don't ask me how it works exactly! It'd be useful to add it to your library code :)
Is __builtin_popcount slow too much? Or only little?
I don't know. Maybe you can tell me :)
Seems that it is the fastest way to count bits in c++ in general case.
No. The fastest way is to precompute all popcounts for 16-bit parts (for int32 case) or 22-bit parts (for int64 case) and calculate the answer in 2 or 3 bit shifts, array element accesses and summations.
Actually
__builtin_popcount
is faster than so-called array table algorithm (sorry for poor English :), don't know how to express it correctly) is my computer, because the memory reading without cache is slow.__builtin_popcount
should be faster because it compiles into one assembler instruction. But it's not true on codeforces, IIRC MinGW uses bit-shifting algorithm instead.How does the above compare to this approach?
Well it varies with architecture, compiler flags, SSE enabled/disabled. I don't know of an implementation that dominates the rest all the time. Better to benchmark and see for yourself in the platform of your interest.
__builtin_popcount looks to have O (1) complexity. Here is the proposed improvement [1] and the source code [2], look from line number 808.
[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36041
[2] https://gcc.gnu.org/viewcvs/gcc/trunk/libgcc/libgcc2.c?view=markup&pathrev=200506
O log k (k is number of bit). Because k is specified, the complexity is O(1).
It's slow unless you instruct the compiler to use the popcnt instruction.
In all tests, $$$n=10^9$$$.
There is NO __builtin_popcount in c++, it's a built in function of GCC. The function prototype is as follows: int __builtin_popcount(unsigned int) It returns the numbers of set bits in an integer (the number of ones in the binary representation of the integer).
Wow such a fast answer
Hmmm,,,hahaha.
Can you tell me what is the difference between GNU and GCC compilers. Because when i installed vscode I installed compilers from MinGW which had the GCC compilers i believe. But i get confused by GNU
They refer to the same thing. GCC stands for GNU Compiler Collection.
Lol same thing happened with me in a codechef contest .. and i couldn't spot it during the whole contest
You can use just a
bitset<32>(x).count()
andbitset<64>(x).count()
always. It will be optimized on any online judge, you can check assembly there and you will see onlycall __popcountdi2
in both cases.what is the time complexity of __builtin_popcount() which is used as cpp inbuilt function
Related blog post:
Is __builtin_popcount O(1) or O(log_2 k) ?