[#56333] [CommonRuby - Feature #8723][Open] Array.any? predicate returns true for empty array. — "nurettin (Nurettin Onur TUGCU)" <onurtugcu@...>

12 messages 2013/08/02

[#56368] [ruby-trunk - Bug #8730][Open] "rescue Exception" rescues Timeout::ExitException — "takiuchi (Genki Takiuchi)" <genki@...21g.com>

15 messages 2013/08/04

[#56407] [ruby-trunk - misc #8741][Open] email notification on bugs.ruby-lang.org is broken — "rits (First Last)" <redmine@...>

18 messages 2013/08/05

[#56524] [ruby-trunk - Bug #8770][Open] [PATCH] process.c: avoid EINTR from Process.spawn — "normalperson (Eric Wong)" <normalperson@...>

19 messages 2013/08/10

[#56536] [ruby-trunk - Feature #8772][Open] Hash alias #| merge, and the case for Hash and Array polymorphism — "trans (Thomas Sawyer)" <redmine@...>

24 messages 2013/08/11

[#56544] [ruby-trunk - Bug #8774][Open] rb_file_dirname return wrong encoding string when dir is "." — jiayp@... (贾 延平) <jiayp@...>

10 messages 2013/08/11

[#56569] [ruby-trunk - Feature #8781][Open] Use require_relative() instead of require() if possible — "ko1 (Koichi Sasada)" <redmine@...>

31 messages 2013/08/12
[#56582] [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — "drbrain (Eric Hodel)" <drbrain@...7.net> 2013/08/12

[#56584] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — SASADA Koichi <ko1@...> 2013/08/12

(2013/08/13 2:25), drbrain (Eric Hodel) wrote:

[#56636] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — Aaron Patterson <tenderlove@...> 2013/08/16

On Tue, Aug 13, 2013 at 07:38:01AM +0900, SASADA Koichi wrote:

[#56634] [ruby-trunk - Feature #8788][Open] use eventfd on newer Linux instead of pipe for timer thread — "normalperson (Eric Wong)" <normalperson@...>

11 messages 2013/08/16

[#56648] [ruby-trunk - Bug #8795][Open] "Null byte in string error" on Marshal.load — "mml (McClain Looney)" <m@...>

17 messages 2013/08/16

[#56824] [ruby-trunk - Feature #8823][Open] Run trap handler in an independent thread called "Signal thread" — "ko1 (Koichi Sasada)" <redmine@...>

14 messages 2013/08/27

[#56878] [ruby-trunk - misc #8835][Open] Introducing a semantic versioning scheme and branching policy — "knu (Akinori MUSHA)" <knu@...>

11 messages 2013/08/30

[#56890] [ruby-trunk - Feature #8839][Open] Class and module should return the class or module that was opened — "headius (Charles Nutter)" <headius@...>

26 messages 2013/08/30

[#56894] [ruby-trunk - Feature #8840][Open] Yielder#state — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>

14 messages 2013/08/30

[ruby-core:56433] [ruby-trunk - Feature #8748][Open] Integer#popcount (Fixnum#popcount and Bignum#popcount)

From: "akr (Akira Tanaka)" <akr@...>
Date: 2013-08-07 12:51:38 UTC
List: ruby-core #56433
Issue #8748 has been reported by akr (Akira Tanaka).

----------------------------------------
Feature #8748: Integer#popcount (Fixnum#popcount and Bignum#popcount)
https://bugs.ruby-lang.org/issues/8748

Author: akr (Akira Tanaka)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 


How about adding Integer#popcount method?
(actually Fixnum#popcount and Bignum#popcount)

  0.popcount              #=> 0
  1.popcount              #=> 1
  255.popcount            #=> 8
  256.popcount            #=> 1
  (10**100).popcount      #=> 105
  (257**257).popcount     #=> 999

It counts the number of one bits in the integer.
If the integer is negative, the one bits in the absolute number is counted.

popcount has various applications.
Hamming distance, rank/select for succinct data structure,
brightness of monochrome image, etc.

In general, popcount is useful when an array is encoded as an integer.

Several lower layers provides this feature.
gcc and clang has __builtin_popcount.
Intel and AMD provides popcnt instruction.

Several languages and libraries provides this feature:

absolute number: Mathmatica(DigitCount)
two's complement: Java(java.math.BigInteger#bitCount), Scala(bitCount), CommonLisp(logcount), CLN(logcount)
other behavior: GMP(mpz_popcount), Haskell(popCount), Scheme(bitwise-bit-count)
fixed size: gcc (__builtin_popcount), Intel/AMD(popcnt), Java(java.lang.Integer.bitCount)

For negative numbers, my implementation counts bits in abs(n).
I think this is easy to understand, at least.
However many software counts bits in two's complement representation.

There are several names.
I think popcount is popular but bitcount is also a possible name.
I don't like logcount.

Any comments?

Details of the other software:

Mathmatica has DigitCount which can be used as popcount.
n.popcount can be implemented as DigitCount[n, 2, 1].
It seems work for abs(n).  (I tested with Wolfram Alpha.)
http://reference.wolfram.com/mathematica/ref/DigitCount.html

Java has bitCount method in java.lang.Integer and java.math.BigInteger.
java.lang.Integer counts one-bits in two's complement representation
(so it is not applicable for infinite precision integer).
java.math.BigInteger counts bits which is different to sign bit in
two's complement representation.
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#bitCount(int)
http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#bitCount()

Scala has bitCount method too.
It works as Java.
http://www.scala-lang.org/api/current/index.html#scala.math.BigInt

CommonLisp has logcount function.
http://www.lispworks.com/documentation/HyperSpec/Body/f_logcou.htm

CLN has logcount function.
http://www.ginac.de/CLN/cln.html#Exact-numbers

GMP has mpz_popcount.
It returns a some constant for negative values.
http://gmplib.org/manual/Integer-Logic-and-Bit-Fiddling.html#Integer-Logic-and-Bit-Fiddling

Haskell has popCount.
It seems hang for negative values.
http://www.haskell.org/ghc/docs/7.6.2/html/libraries/base/Data-Bits.html#t:Bits

Scheme has bitwise-bit-count.
It returns negative result for negative values.
http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-12.html#node_sec_11.1



-- 
http://bugs.ruby-lang.org/
_______________________________________________
ruby-core mailing list
ruby-core@ruby-lang.org
http://lists.ruby-lang.org/cgi-bin/mailman/listinfo/ruby-core

In This Thread

Prev Next