A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© as604049322 金牌黑马   /  2014-12-8 19:41  /  809 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单用位运算完成哦

1 个回复

倒序浏览

  1. import java.util.*;

  2. public class Addition {
  3.         public static void main(String[] args){
  4.                         System.out.println(addition(5,17));
  5.         }
  6. /*
  7. 5的二进制是101,17的二进制10001。还是试着把计算分成三步:第一步各位相加但不计进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10。这一步不计进位,因此结果仍然是0);第二步记下进位。在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10;第三步把前两步的结果相加,得到的结果是10110,正好是22。由此可见三步走的策略对二进制也是管用的。

  8. 接下来我们试着把二进制上的加法用位运算来替代。第一步不考虑进位,对每一位相加。0加0与 1加1的结果都0,0加1与1加0的结果都是1。我们可以注意到,这和异或的结果是一样的。对异或而言,0和0、1和1异或的结果是0,而0和1、1和0的异或结果是1。接着考虑第二步进位,对0加0、0加1、1加0而言,都不会产生进位,只有1加1时,会向前产生一个进位。此时我们可以想象成是两个数先做位与运算,然后再向左移动一位。只有两个数都是1的时候,位与得到的结果是1,其余都是0。第三步把前两个步骤的结果相加。如果我们定义一个函数AddWithoutArithmetic,第三步就相当于输入前两步骤的结果来递归调用自己。
  9. */
  10.                 public static int addition(int num1, int num2){
  11.                         if(num2 == 0)
  12.                                 return num1;
  13.                         if(num1 == 0)
  14.                                 return num2;
  15.                         int sum = num1 ^ num2;
  16.                         int carry = (num1 & num2) << 1;
  17.                         return addition(sum, carry);
  18.                 }
  19. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马