参考这个解法

https://leetcode-cn.com/problems/qiu-12n-lcof/solution/yan-jiu-liao-ban-tian-zhong-yu-kan-dong-da-lao-de-/

这是大佬的源码;
      /**
     * 负数在参与位运算时使用的是补码
     * -1的原码是   10000000 00000000 00000000 00000001
     * -1的反码是   11111111 11111111 11111111 11111110
     * -1的补码是   11111111 11111111 11111111 11111111
     * 因此任何数与-1做与运算的结果任然为原数
     */
    public static int sumNums(int n) {
        /**
         * 由等差数列求和公式可知,结果等于n*(n+1)/2,其中除以2可以通过右移1位进行操作
         * 但n*(n+1)在不允许使用乘法的情况下,只能把n或n+1其中一个拆解为2的n次幂数之和,配合另一个来进行位运算和累加
         * 此代码利用了-1和任何整数进行与运算还等于原数的特点
         * -(n + 1 >> 0 & 1)用于求从低到高第i+1位如果为0取,如果为1取-1
         */
        int n1 = (n & -(n + 1 >> 0 & 1)) << 0;
        int n2 = (n & -(n + 1 >> 1 & 1)) << 1;
        int n3 = (n & -(n + 1 >> 2 & 1)) << 2;
        int n4 = (n & -(n + 1 >> 3 & 1)) << 3;
        int n5 = (n & -(n + 1 >> 4 & 1)) << 4;
        int n6 = (n & -(n + 1 >> 5 & 1)) << 5;
        int n7 = (n & -(n + 1 >> 6 & 1)) << 6;
        int n8 = (n & -(n + 1 >> 7 & 1)) << 7;
        int n9 = (n & -(n + 1 >> 8 & 1)) << 8;
        int n10 = (n & -(n + 1 >> 9 & 1)) << 9;
        int n11 = (n & -(n + 1 >> 10 & 1)) << 10;
        int n12 = (n & -(n + 1 >> 11 & 1)) << 11;
        int n13 = (n & -(n + 1 >> 12 & 1)) << 12;
        int n14 = (n & -(n + 1 >> 13 & 1)) << 13;
        System.out.println(n1+"--"+n2+"--"+n3+"--"+n4+"--"+n5+"--"+n6+"--"+n7+"--"+n8+"--"+n9
                +"--"+n10+"--"+n11+"--"+n12+"--"+n13+"--"+n14);
        return (n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10 + n11 + n12 + n13 + n14) >> 1;
    }

这是自己的分析过程
        int n = 48;
        //将48分解成0011,0000,并且从小到大依次移动位数,
        //00110001与0000,0001作比较==>0000,0001==>0,可知第8个数是1
        //00011000与0000,0001作比较==>0000,0001==>0,可知第7个数是0
        //00001100与0000,0001作比较==>0000,0001==>0,可知第6个数是0
        //00000110与0000,0001作比较==>0000,0001==>0,可知第5个数是0
        //00000011与0000,0001作比较==>0000,0001==>1,可知第4个数是1
        //00000001与0000,0001作比较==>0000,0001==>1,可知第3个数是1
        //00000000与0000,0001作比较==>0000,0001==>0,可知第2个数是0
        //00000000与0000,0001作比较==>0000,0001==>0,可知第1个数是0
        System.out.println(n + 1 >> 0 & 1);
        System.out.println(n + 1 >> 1 & 1);
        System.out.println(n + 1 >> 2 & 1);
        System.out.println(n + 1 >> 3 & 1);
        System.out.println(n + 1 >> 4 & 1);
        System.out.println(n + 1 >> 5 & 1);
        System.out.println(n + 1 >> 6 & 1);
        System.out.println(n + 1 >> 7 & 1);
        System.out.println(n + 1 >> 8 & 1);
        System.out.println("==============");
        //0->-1
        //0->0
        //0->0
        //0->0
        //1->-1
        //1->-1
        //0->0
        //0->0
        //0->0
        //0->0
        System.out.println(-(n + 1 >> 0 & 1));
        System.out.println(-(n + 1 >> 1 & 1));
        System.out.println(-(n + 1 >> 2 & 1));
        System.out.println(-(n + 1 >> 3 & 1));
        System.out.println(-(n + 1 >> 4 & 1));
        System.out.println(-(n + 1 >> 5 & 1));
        System.out.println(-(n + 1 >> 6 & 1));
        System.out.println(-(n + 1 >> 7 & 1));
        System.out.println(-(n + 1 >> 8 & 1));
        System.out.println("==============");
        System.out.println("-1的二进制:" + Integer.toBinaryString(-1));
        //因此任何数与-1做与运算的结果任然为原数
        //-1&48==>11111111&00110000==>00000001==>48
        //0&48==>00000000&00110000==>00000000==>0
        //0&48==>00000000&00110000==>00000000==>0
        //0&48==>00000000&00110000==>00000000==>0
        //-1&48==>11111111&00110000==>00110000==>48
        //-1&48==>11111111&00110000==>00110000==>48
        //0&48==>00000000&00110000==>00000000==>0
        //0&48==>00000000&00110000==>00000000==>0
        System.out.println(n & -(n + 1 >> 0 & 1));
        System.out.println(n & -(n + 1 >> 1 & 1));
        System.out.println(n & -(n + 1 >> 2 & 1));
        System.out.println(n & -(n + 1 >> 3 & 1));
        System.out.println(n & -(n + 1 >> 4 & 1));
        System.out.println(n & -(n + 1 >> 5 & 1));
        System.out.println(n & -(n + 1 >> 6 & 1));
        System.out.println(n & -(n + 1 >> 7 & 1));
        System.out.println(n & -(n + 1 >> 8 & 1));
        System.out.println("=========================");
        //按照幂次扩大,不是很理解为什么这一步的操作,就整体而言,如何从将整体分解成这几步的想法搞不懂,难受
        //00000001==>48<<0==>000000000001==>48
        //00000000==>0 <<2==>000000000000==>0
        //00000000==>0 <<3==>000000000000==>0
        //00000000==>0 <<4==>000000000000==>0
        //00110000==>48<<5==>000110000000==>768
        //00110000==>48<<6==>011000000000==>1536
        //00000000==>0 <<7==>000000000000==>0
        //00000000==>0 <<8==>000000000000==>0
        System.out.println((n & -(n + 1 >> 0 & 1)) << 0);
        System.out.println((n & -(n + 1 >> 1 & 1)) << 1);
        System.out.println((n & -(n + 1 >> 2 & 1)) << 2);
        System.out.println((n & -(n + 1 >> 3 & 1)) << 3);
        System.out.println((n & -(n + 1 >> 4 & 1)) << 4);
        System.out.println((n & -(n + 1 >> 5 & 1)) << 5);
        System.out.println((n & -(n + 1 >> 6 & 1)) << 6);
        System.out.println((n & -(n + 1 >> 7 & 1)) << 7);
        System.out.println((n & -(n + 1 >> 8 & 1)) << 8);
        System.out.println();
        //结果==>48+768+1536 << 1 == 1176
解法二:
> https://leetcode-cn.com/problems/qiu-12n-lcof/solution/mian-shi-ti-64-qiu-1-2-nluo-ji-fu-duan-lu-qing-xi-/
    public int sum(int n){
        //还是用递归的形式相加可符合题目,那么剩下的问题就是递归的终止判断条件,既然不能用if,很多解法给的是boolen判断,
        //但是,不知道boolen的判断形式是不是也是用if形式做的源码处理
        //n + (n-1) + (n-2) + (n-3) ...直到n > 1
        boolean x = n > 1 && (n += sum(n - 1)) > 0;
        return n;
    }