
Issue #20163 has been updated by tenderlovemaking (Aaron Patterson). mame (Yusuke Endoh) wrote in #note-10:
What are the intended use cases for this proposal?
My experience (in other languages) involves two use cases of popcount:
* Bitboards for game AI (like Reversi) to count pieces. * Succinct data structures (like LOUDS Tries) for rank operations.
In both scenarios, integers are treated as unsigned bitsets.
My experience is similar. I've used it for sets (like I linked above) as well as modeling [undirected graphs](https://tenderlovemaking.com/2023/03/19/bitmap-matrix-and-undirected-graphs-...) (a bit matrix, but I omitted popcount from the blog post). I've only used unsigned integers, and I think it would be a bug in my code if the integers were signed.
Does anyone have a use case where popcount on a negative number is necessary? If not, I guess raising an exception would be the best behavior.
I agree, and I think it should raise an exception. ahorek (Pavel Rosický) wrote in #note-12:
That said, Ruby isn’t the ideal choice for implementing memory allocators, SIMD masks, parity checks, GCD calculations, UTF parsers, or prime sieving…
Not yet! But hopefully someday! 😂 ---------------------------------------- Feature #20163: Introduce #bit_count method on Integer https://bugs.ruby-lang.org/issues/20163#change-114450 * Author: garrison (Garrison Jensen) * Status: Open ---------------------------------------- This feature request is to implement a method called #bit_count on Integer that returns the number of ones in the binary representation of the absolute value of the integer. ``` n = 19 n.bit_count #=> 3 (-n).bit_count #=> 3 ``` This is often useful when you use an integer as a bitmask and want to count how many bits are set. This would be equivalent to ``` n.to_s(2).count("1") ``` However, this can be outperformed by ``` def bit_count(n) count = 0 while n > 0 n &= n - 1 # Flip the least significant 1 bit to 0 count += 1 end count end ``` I think this would be a useful addition because it would fit alongside the other bit-related methods defined on integer: `#bit_length,` `#allbits?`, `#anybits?`, `#nobits?`. Also, when working with bitmasks, a minor upgrade to performance often results in a significant improvement. Similar methods from other languages: https://docs.python.org/3/library/stdtypes.html#int.bit_count https://doc.rust-lang.org/std/primitive.i32.html#method.count_ones -- https://bugs.ruby-lang.org/