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

研究了半天,终于看懂大佬的位运算思路了
这个思路不但没用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值