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.__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).