计算所有数字中的总位集合,将n作为位,将s视为集合

在一次编程黑客马拉松期间,我想到了一个问题,写一个函数来计算所有数字中的总位集合,考虑到n为位和s为集合,如果我将n传递为3,则计数集为7为:

1: 001
2: 010
3: 011
4: 100
5: 101
6: 110
7: 111

我对3组代码的正确评估如下,但它失败了4位,我不知道为什么,尽管按照我的观点,我认为这是正确的:

public int countSetBits(int n, int set){
    while(n>0){
        int i = (int)(Math.log10(n)/Math.log10(2));
        set = set + Math.pow(2, i-1) + i;
        set = set + n - Math.pow(2, i) + 1;
        n = n - Math.pow(2, i);
    }
    return set;
}

但是,这在自动测试用例中无法进行4位检查。什么可能是错误的,并做了改进才能通过所有 如果回答,请说明您为何如此的理性思考过程。