代码改变世界

Add Binary

2015-03-10 10:27  笨笨的老兔子  阅读(208)  评论(0编辑  收藏  举报

做一个二进制数字加法器

按照正常思路进行加法即可,设定一个进位变量carry,然后进行模拟

  1. class Solution {
  2. public:
  3. string addBinary(string longStr, string shortStr) {
  4. string res;
  5. if (longStr.size() < shortStr.size())
  6. {
  7. res = longStr;
  8. longStr = shortStr;
  9. shortStr = res;
  10. }
  11. res = longStr;
  12. int carry = 0, bit = 0;
  13. int i = shortStr.size() - 1, j = longStr.size() - 1;
  14. for (; i >= 0; i--, j--)
  15. {
  16. bit = shortStr[i] + longStr[j] + carry -'0' - '0';
  17. switch (bit)
  18. {
  19. case 0:
  20. carry = 0;
  21. break;
  22. case 1:
  23. res[j] = '1';
  24. carry = 0;
  25. break;
  26. case 2:
  27. res[j] = '0';
  28. carry = 1;
  29. break;
  30. case 3:
  31. res[j] = '1';
  32. carry = 1;
  33. break;
  34. default:
  35. break;
  36. }
  37. }
  38. while (carry != 0 && j>=0)
  39. {
  40. bit = longStr[j] + carry - '0';
  41. switch (bit)
  42. {
  43. case 1:
  44. res[j] = '1';
  45. carry = 0;
  46. break;
  47. case 2:
  48. res[j] = '0';
  49. carry = 1;
  50. j--;
  51. break;
  52. default:
  53. break;
  54. }
  55. }
  56. if (carry == 1)
  57. {
  58. res = "1" + res;
  59. }
  60. return res;
  61. }
  62. };

在评论区看到一个简短的代码,我做了一些小优化,性能和以上代码一样都是6ms,但是很值得学习

  1. class Solution
  2. {
  3. public:
  4. string addBinary(string a, string b)
  5. {
  6. string s = "";
  7. int c = 0, i = a.size() - 1, j = b.size() - 1;
  8. while (i >= 0 || j >= 0 || c == 1)
  9. {
  10. c += i >= 0 ? a[i--] - '0' : 0;
  11. c += j >= 0 ? b[j--] - '0' : 0;
  12. s = char((c & 1)+ '0') + s;
  13. c = c >> 1;
  14. }
  15. return s;
  16. }
  17. };