Untitled

 avatar
unknown
c_cpp
a year ago
620 B
6
Indexable
long long countSetBitsAtPosition(long long n, int i) {
    if (n < 0) return 0;

    // Use unsigned long long to avoid negative overflow issues
    unsigned long long uln = static_cast<unsigned long long>(n);
    unsigned long long cycleLength = 1ULL << (i + 1);
    unsigned long long completeCycles = uln / cycleLength;
    unsigned long long setBitsCount = completeCycles * (cycleLength / 2);

    unsigned long long remainingNumbers = uln % cycleLength;
    if (remainingNumbers >= cycleLength / 2) {
        setBitsCount += remainingNumbers - (cycleLength / 2) + 1;
    }

    return setBitsCount;
}
Editor is loading...
Leave a Comment