用位运算解决两个加,减,乘,除
位运算符
与
//11 为 1 | 10 为 0 | 01 为 0
1001 & 1000 = 1000
或
//11 为 1 | 10 为 1 | 01 为 1
1111 | 1000 = 1111
非
//取反 1000 = 0111
~1000 = 0111
异或
//相同为0 不同为1
1000 ^ 1000 = 0000
简单熟悉了位运算的基本规律
在计算机中是用二进制储存信息,我们平时看到的十进制也就是我们生活所用的阿拉伯数字在计算机中是没有相加的,而是通过二进制“与”,“异或”等方式递归
- 加法
5 + 6 = 11
在计算机中
代码实现
static int add(int a,int b) { //&判断是否存在进位 ^不进位加法
if(a==0)return b;
return add((a&b)<<1,a^b);
}
上面是一个按照图设计的一个递归,如果没有进位就返回b
每次都做a和b都做不进位加法
运行结果
2. 减法
相对理解了加法,那么减法就是特别简单了
减法不就是 5 + -6
5 + -6 = -1
在计算机中负数就是取反加一
~101010 + 1
代码实现
sum = add(sc.nextInt(),~sc.nextInt()+1);
System.out.println(sum);
结果
3. 乘法
相对其他只要理解了加法的运算规律,乘法也就是乘以多少个一样的
5 × 6 = 30
也就是乘以多少个5
5 + 5 + 5 + 5 + 5 = 30
最简单的就是做个循环依次相加
代码实现
int sum =0;
for(int i=0;i<b;i++) {
sum=add(sum,a);
}
System.out.println(sum);
结果
4. 除法
除法就更简单了,减去多少个它,剩下的就是取模
30 / 6 =5
30 - 6 - 6 -6 -6 -6 =0
代码实现
int sum=0;
while(a>=b) {
a=add(a,(~b)+1);
sum++;
}
System.out.println("商:"+sum);
System.out.println("余:"+a+"\n公约数:");
结果
总结一下
整个“加减乘除”只要掌握了加法的规律,其他就是稍作改变就可以演变