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