求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

这篇博客介绍了一种巧妙的方法来求解1到n的和,不使用乘除法、循环和条件判断语句。通过位运算,利用-1和任何整数进行与运算仍等于原数的特性,逐步累加每个位上的数值,最终将结果右移一位除以2得到和。
摘要由CSDN通过智能技术生成

研究了半天,终于看懂大佬的位运算思路了
这个思路不但没用if这种条件判断语句,连逻辑运算中的短路运算也没有用到,也就是连判断的语义也没用到,确实挺牛的,还好这个题限制了n的大小,即限制了n二进制的位数,不然得累加32次……我在代码里为了可读性用临时变量保存了每一位的累加求解,当然一个return也是没问题的。

代码

 

class Solution {
    /**
     * 负数在参与位运算时使用的是补码
     * -1的原码是   10000000 00000000 00000000 00000001
     * -1的反码是   11111111 11111111 11111111 11111110
     * -1的补码是   11111111 11111111 11111111 11111111
     * 因此任何数与-1做与运算的结果任然为原数
     */
    public 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)) &l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值