Let's say I have an integer I and want to get the count of 1s in its binary form.
I am currently using the following code.
Number(i.toString(2).split("").sort().join("")).toString().length;
Is there a faster way to do this? I am thinking about using bitwise operators. Any thoughts?
NOTE: i
is within the 32-bit limitation.
We can also use bitset::count(), an inbuilt STL in C++ that returns the count of the total number of set bits in an integer.
The JavaScript Number type is a double-precision 64-bit binary format IEEE 754 value, like double in Java or C#.
Integer, 32 Bit data type is the default for most numerical tags where variables have the potential for negative or positive values.
You can use a strategy from this collection of Bit Twiddling Hacks:
function bitCount (n) { n = n - ((n >> 1) & 0x55555555) n = (n & 0x33333333) + ((n >> 2) & 0x33333333) return ((n + (n >> 4) & 0xF0F0F0F) * 0x1010101) >> 24 } console.log(bitCount(0xFF)) //=> 8
Note that the above strategy only works for 32-bit integers (a limitation of bitwise operators in JavaScript).
A more general approach for larger integers would involve counting 32-bit chunks individually (thanks to harold for the inspiration):
function bitCount (n) { var bits = 0 while (n !== 0) { bits += bitCount32(n | 0) n /= 0x100000000 } return bits } function bitCount32 (n) { n = n - ((n >> 1) & 0x55555555) n = (n & 0x33333333) + ((n >> 2) & 0x33333333) return ((n + (n >> 4) & 0xF0F0F0F) * 0x1010101) >> 24 } console.log(bitCount(Math.pow(2, 53) - 1)) //=> 53
You could also use a regular expression:
function bitCount (n) { return n.toString(2).match(/1/g).length } console.log(bitCount(0xFF)) //=> 8
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With