位运算算法
- 剑指offer 65 难度 :简单
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
题解:不可以使用加减乘除,使用位运算,从位运算的实现加法的规律可以看出来:s=a+b可以转换为s=c+n,c为进位和,n为非进位和。而可以发现:
n=a⊕b非进位和:异或运算
c=a&b<<1进位:与运算+左移一位
循环进行位运算,直到某一个加数为0。
在计算机系统中,数值一律用 补码 来表示和存储。补码的优势: 加法、减法可以统一处理(CPU只有加法器)。因此,以上方法 同时适用于正数和负数的加法 。
代码:
public int add(int a, int b) {
while(b!=0){
int c=(a&b) <<1;
a^=b;
b=c;
}
return a;
}
- 剑指offer 64 求1+2+…+n 难度 :中等
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
题解:用递归的方法的:
public int sumNums(int n) {
if(n==1) return 1;
return n+sumNums(n-1);
}
但是题目要求不能用关键字,现在要想办法替换这个判断,这个时候要想到逻辑运算的短路效应:
if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路)
if(A || B) // 若 A 为 true ,则 B 的判断不会执行(即短路)
最终代码:
public int sumNums(int n) {
boolean x=n>0 && (n+=sumNums(n-1))>0;
return n;
}
但是在评论里面看到一个更秀的解法,人傻掉,可太秀了
class Solution {
int[] test=new int[]{0};
public int sumNums(int n) {
try{
return test[n];
}catch(Exception e){
return n+sumNums(n-1);
}
}
}