Project

General

Profile

Actions

Feature #20163

open

Introduce #bit_count method on Integer

Added by garrison (Garrison Jensen) 4 months ago. Updated 4 months ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:116083]

Description

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


Related issues 1 (0 open1 closed)

Is duplicate of Ruby master - Feature #8748: Integer#popcount (Fixnum#popcount and Bignum#popcount)RejectedActions
Actions

Also available in: Atom PDF

Like1
Like1Like0Like0Like1Like0Like0