Files
codewars/count-ones-in-a-segment/index.js
2017-08-16 03:03:51 +02:00

48 lines
817 B
JavaScript

// 0 0 0 0 0
// 1 0 0 0 1
// 2 0 0 1 0
// 3 0 0 1 1
// 4 0 1 0 0
// 5 0 1 0 1
// 6 0 1 1 0
// 7 0 1 1 1
// 8 1 0 0 0
// 9 1 0 0 1
// 10 1 0 1 0
// 11 1 0 1 1
// 12 1 1 0 0
// 13 1 1 0 1
// 14 1 1 1 0
// 15 1 1 1 1
// count column bits
function ccb(col, n) {
let div = (n + 1) / (2 << col);
let sum = Math.floor(div);
let rest = Math.max(0, (div - sum) * (2 << col) - (1 << col));
return sum * (1 << col) + rest;
}
// count all bits
function cab(n) {
// n < 1e9 => log2(1e9) ~= 30
let bits = 0;
for (let i = 0; i < 30; ++i) {
bits += ccb(i, n);
}
return bits;
}
// calc between range
function cbr(a, b) {
return cab(b) - cab(a-1)
}
// for (let i = 0; i < 16; ++i) {
// console.log(i, cab(i));
// }
function countOnes(left, right) {
return cbr(left, right);
}