What is a^b and (a&b)<<1?












8















I was doing this question in leetcode.



Request:




Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.




I can't understand the solution it gave



Could someone explain how this getSum function works?



Here is answer's JS:




var getSum=function(a,b){
const Sum=a^b;//I can't understand it.Please give me an example to understand it
const carry=(a&b)<<1;//I can't understand it too
if(!carry){
return Sum
}
return getSum(Sum,carry);
};
console.log(getSum(5,1));












share|improve this question



























    8















    I was doing this question in leetcode.



    Request:




    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.




    I can't understand the solution it gave



    Could someone explain how this getSum function works?



    Here is answer's JS:




    var getSum=function(a,b){
    const Sum=a^b;//I can't understand it.Please give me an example to understand it
    const carry=(a&b)<<1;//I can't understand it too
    if(!carry){
    return Sum
    }
    return getSum(Sum,carry);
    };
    console.log(getSum(5,1));












    share|improve this question

























      8












      8








      8


      1






      I was doing this question in leetcode.



      Request:




      Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.




      I can't understand the solution it gave



      Could someone explain how this getSum function works?



      Here is answer's JS:




      var getSum=function(a,b){
      const Sum=a^b;//I can't understand it.Please give me an example to understand it
      const carry=(a&b)<<1;//I can't understand it too
      if(!carry){
      return Sum
      }
      return getSum(Sum,carry);
      };
      console.log(getSum(5,1));












      share|improve this question














      I was doing this question in leetcode.



      Request:




      Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.




      I can't understand the solution it gave



      Could someone explain how this getSum function works?



      Here is answer's JS:




      var getSum=function(a,b){
      const Sum=a^b;//I can't understand it.Please give me an example to understand it
      const carry=(a&b)<<1;//I can't understand it too
      if(!carry){
      return Sum
      }
      return getSum(Sum,carry);
      };
      console.log(getSum(5,1));








      var getSum=function(a,b){
      const Sum=a^b;//I can't understand it.Please give me an example to understand it
      const carry=(a&b)<<1;//I can't understand it too
      if(!carry){
      return Sum
      }
      return getSum(Sum,carry);
      };
      console.log(getSum(5,1));





      var getSum=function(a,b){
      const Sum=a^b;//I can't understand it.Please give me an example to understand it
      const carry=(a&b)<<1;//I can't understand it too
      if(!carry){
      return Sum
      }
      return getSum(Sum,carry);
      };
      console.log(getSum(5,1));






      javascript






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 1 hour ago









      JackyJacky

      1758




      1758
























          4 Answers
          4






          active

          oldest

          votes


















          9














          Let's imagine that a = 3 and b = 5



          In binary notation they are a = 0011 and b = 0101



          XOR:
          a^b is XOR operator. When compare two bits it returns 0 if they are same and 1 if they are different. 01^10 => 11



          So when we're doing a^b result will be 0110 (6 in decimal)



          AND + SHIFT



          a&b performs logical AND operation. It returns 1 only when a = b = 1.



          In our case the result is 0001



          << shifts it(adds 0 on the right side) and result became 0010 which sets carry variable true. (only 0000 will be false).



          Next iterations:



          Everything repeats but now a = 0110 and b = 0010 (Sum and carry from last execution)



          Now a^b = 0100 and (a&b)<<1 = 0100



          Repeating again.



          Now a^b = 0000 and (a&b)<<1 = 1000



          And again.



          Now a^b = 1000 and (a&b)<<1 = 0000. Now carry is finally false. And we're returning 1000 which is decimal 8.



          Everything worked fine since 3+5=8






          share|improve this answer





















          • 1





            Great explanation! I always find the bitwise operations hard to understand

            – Francisco Hanna
            1 hour ago



















          1














           int result = p ^ q; // XOR Operator, + without carry 0+0=0, 0+1=1+0=1, 1+1=0
          int carry = (p & q) << 1; // Left Shift, 1+1=2
          if (carry != 0) {
          return getSum(result, carry);
          }
          return result;


          Start By p=5,q=6. Then the XOR would be,



          0101
          0110
          ------
          0011


          So, XORing results in (0011) which is actually 3 in decimal. Then ANDing p and q we get,



          0101
          0110
          -------
          0100


          We get 4 (100 in binary) by ANDing 5 & 6, now if we left shift this value by 1, we get



           0100<<1=1000


          So we get 8 (1000 in binary) after first recursion.As the result (carry variable) isnt zero, lets recursion again by xor value and carry value.



          getSum(3, 8);


          So, doing the first XORing we get,



          0011
          1000
          -------
          1011


          The XORing this time yielded in 11 (1011 binary),so we perform the AND now,



          0011
          1000
          -------
          0000


          We get all ZERO for ANDing 3 and 8, so this time the left shift operator also results in ZERO, as we have no 1 here which may give us a value by left shifing zeroes.
          As the carry variable is now Zero, we come to the end of recursion and the XORed value will be the Sum, which is 11 (1011 in Binary).



          Hope you get the working of the procedure. You can learn more by learning bitwise operation, as its the way the machine do the arithmatic operations.






          share|improve this answer

































            0














            It's basically replicating the half-adder



            Adding 2 bits A and B produces 2 outputs: a sum and a carry bit like below



            ╔═══════╤═════════════╗
            ║ Input │ Output ║
            ╠═══╤═══╪═══════╤═════╣
            ║ A │ B │ carry │ sum ║
            ╟───┼───┼───────┼─────╢
            ║ 0 │ 0 │ 0 │ 0 ║
            ╟───┼───┼───────┼─────╢
            ║ 1 │ 0 │ 0 │ 1 ║
            ╟───┼───┼───────┼─────╢
            ║ 0 │ 1 │ 0 │ 1 ║
            ╟───┼───┼───────┼─────╢
            ║ 1 │ 1 │ 1 │ 0 ║
            ╚═══╧═══╧═══════╧═════╝


            From the table we get the logic for the outputs: carry = A and B, sum = A xor B





            So the snippet above is working like this



            const Sum=a^b;              // sum = a xor b
            const carry=(a&b)<<1; // carry = 2*(a and b), since we carry to the next bit
            if(!carry){
            return Sum; // no carry, so sum + carry = sum
            }
            return getSum(Sum,carry); // a + b = sum + carry


            See also




            • Adding two numbers without + operator (Clarification)

            • What is the best way to add two numbers without using the + operator?

            • adds two numbers without using + or any arithmetic operators

            • Adding two numbers without using the addition operator





            share































              -1














              These are bitwise operations. They're close to hardware language.






              share|improve this answer



















              • 7





                Too short.You didn't explain why this works and how

                – Jacky
                1 hour ago






              • 1





                Link-only answers are discouraged here. Please add the relevant content in the answer itself.

                – Ian McLaird
                1 hour ago






              • 3





                It’s binary math. WofWca would have to give you a very very long explanation on binary to explain it. You should really read the W3 Schools article or watch some videos on Bitwise calculations. It’s the kind of thing that would be a few days of class work in college. The comment about link-only answers is fair, but I doubt you’ll grasp the concept from a StackOverflow post alone though.

                – Nate
                1 hour ago








              • 1





                @IanMcLaird It's not a link-only answer. The link content ("bitwise operations") is sufficient as an answer. Similar to an answer such as "Use the method abc.def.xyz".

                – user202729
                42 mins ago






              • 2





                @Jacky You didn't say that you don't know those, did you? If you had known what bitwise operations are, this answers would be sufficient (which may happen in case you are familiar with bitwise operations in another language, and don't know where to find the documentation and is completely unfamiliar with JS)

                – user202729
                40 mins ago











              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55193135%2fwhat-is-ab-and-ab1%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              4 Answers
              4






              active

              oldest

              votes








              4 Answers
              4






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              9














              Let's imagine that a = 3 and b = 5



              In binary notation they are a = 0011 and b = 0101



              XOR:
              a^b is XOR operator. When compare two bits it returns 0 if they are same and 1 if they are different. 01^10 => 11



              So when we're doing a^b result will be 0110 (6 in decimal)



              AND + SHIFT



              a&b performs logical AND operation. It returns 1 only when a = b = 1.



              In our case the result is 0001



              << shifts it(adds 0 on the right side) and result became 0010 which sets carry variable true. (only 0000 will be false).



              Next iterations:



              Everything repeats but now a = 0110 and b = 0010 (Sum and carry from last execution)



              Now a^b = 0100 and (a&b)<<1 = 0100



              Repeating again.



              Now a^b = 0000 and (a&b)<<1 = 1000



              And again.



              Now a^b = 1000 and (a&b)<<1 = 0000. Now carry is finally false. And we're returning 1000 which is decimal 8.



              Everything worked fine since 3+5=8






              share|improve this answer





















              • 1





                Great explanation! I always find the bitwise operations hard to understand

                – Francisco Hanna
                1 hour ago
















              9














              Let's imagine that a = 3 and b = 5



              In binary notation they are a = 0011 and b = 0101



              XOR:
              a^b is XOR operator. When compare two bits it returns 0 if they are same and 1 if they are different. 01^10 => 11



              So when we're doing a^b result will be 0110 (6 in decimal)



              AND + SHIFT



              a&b performs logical AND operation. It returns 1 only when a = b = 1.



              In our case the result is 0001



              << shifts it(adds 0 on the right side) and result became 0010 which sets carry variable true. (only 0000 will be false).



              Next iterations:



              Everything repeats but now a = 0110 and b = 0010 (Sum and carry from last execution)



              Now a^b = 0100 and (a&b)<<1 = 0100



              Repeating again.



              Now a^b = 0000 and (a&b)<<1 = 1000



              And again.



              Now a^b = 1000 and (a&b)<<1 = 0000. Now carry is finally false. And we're returning 1000 which is decimal 8.



              Everything worked fine since 3+5=8






              share|improve this answer





















              • 1





                Great explanation! I always find the bitwise operations hard to understand

                – Francisco Hanna
                1 hour ago














              9












              9








              9







              Let's imagine that a = 3 and b = 5



              In binary notation they are a = 0011 and b = 0101



              XOR:
              a^b is XOR operator. When compare two bits it returns 0 if they are same and 1 if they are different. 01^10 => 11



              So when we're doing a^b result will be 0110 (6 in decimal)



              AND + SHIFT



              a&b performs logical AND operation. It returns 1 only when a = b = 1.



              In our case the result is 0001



              << shifts it(adds 0 on the right side) and result became 0010 which sets carry variable true. (only 0000 will be false).



              Next iterations:



              Everything repeats but now a = 0110 and b = 0010 (Sum and carry from last execution)



              Now a^b = 0100 and (a&b)<<1 = 0100



              Repeating again.



              Now a^b = 0000 and (a&b)<<1 = 1000



              And again.



              Now a^b = 1000 and (a&b)<<1 = 0000. Now carry is finally false. And we're returning 1000 which is decimal 8.



              Everything worked fine since 3+5=8






              share|improve this answer















              Let's imagine that a = 3 and b = 5



              In binary notation they are a = 0011 and b = 0101



              XOR:
              a^b is XOR operator. When compare two bits it returns 0 if they are same and 1 if they are different. 01^10 => 11



              So when we're doing a^b result will be 0110 (6 in decimal)



              AND + SHIFT



              a&b performs logical AND operation. It returns 1 only when a = b = 1.



              In our case the result is 0001



              << shifts it(adds 0 on the right side) and result became 0010 which sets carry variable true. (only 0000 will be false).



              Next iterations:



              Everything repeats but now a = 0110 and b = 0010 (Sum and carry from last execution)



              Now a^b = 0100 and (a&b)<<1 = 0100



              Repeating again.



              Now a^b = 0000 and (a&b)<<1 = 1000



              And again.



              Now a^b = 1000 and (a&b)<<1 = 0000. Now carry is finally false. And we're returning 1000 which is decimal 8.



              Everything worked fine since 3+5=8







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited 1 hour ago

























              answered 1 hour ago









              vicodinvicodin

              1,097624




              1,097624








              • 1





                Great explanation! I always find the bitwise operations hard to understand

                – Francisco Hanna
                1 hour ago














              • 1





                Great explanation! I always find the bitwise operations hard to understand

                – Francisco Hanna
                1 hour ago








              1




              1





              Great explanation! I always find the bitwise operations hard to understand

              – Francisco Hanna
              1 hour ago





              Great explanation! I always find the bitwise operations hard to understand

              – Francisco Hanna
              1 hour ago













              1














               int result = p ^ q; // XOR Operator, + without carry 0+0=0, 0+1=1+0=1, 1+1=0
              int carry = (p & q) << 1; // Left Shift, 1+1=2
              if (carry != 0) {
              return getSum(result, carry);
              }
              return result;


              Start By p=5,q=6. Then the XOR would be,



              0101
              0110
              ------
              0011


              So, XORing results in (0011) which is actually 3 in decimal. Then ANDing p and q we get,



              0101
              0110
              -------
              0100


              We get 4 (100 in binary) by ANDing 5 & 6, now if we left shift this value by 1, we get



               0100<<1=1000


              So we get 8 (1000 in binary) after first recursion.As the result (carry variable) isnt zero, lets recursion again by xor value and carry value.



              getSum(3, 8);


              So, doing the first XORing we get,



              0011
              1000
              -------
              1011


              The XORing this time yielded in 11 (1011 binary),so we perform the AND now,



              0011
              1000
              -------
              0000


              We get all ZERO for ANDing 3 and 8, so this time the left shift operator also results in ZERO, as we have no 1 here which may give us a value by left shifing zeroes.
              As the carry variable is now Zero, we come to the end of recursion and the XORed value will be the Sum, which is 11 (1011 in Binary).



              Hope you get the working of the procedure. You can learn more by learning bitwise operation, as its the way the machine do the arithmatic operations.






              share|improve this answer






























                1














                 int result = p ^ q; // XOR Operator, + without carry 0+0=0, 0+1=1+0=1, 1+1=0
                int carry = (p & q) << 1; // Left Shift, 1+1=2
                if (carry != 0) {
                return getSum(result, carry);
                }
                return result;


                Start By p=5,q=6. Then the XOR would be,



                0101
                0110
                ------
                0011


                So, XORing results in (0011) which is actually 3 in decimal. Then ANDing p and q we get,



                0101
                0110
                -------
                0100


                We get 4 (100 in binary) by ANDing 5 & 6, now if we left shift this value by 1, we get



                 0100<<1=1000


                So we get 8 (1000 in binary) after first recursion.As the result (carry variable) isnt zero, lets recursion again by xor value and carry value.



                getSum(3, 8);


                So, doing the first XORing we get,



                0011
                1000
                -------
                1011


                The XORing this time yielded in 11 (1011 binary),so we perform the AND now,



                0011
                1000
                -------
                0000


                We get all ZERO for ANDing 3 and 8, so this time the left shift operator also results in ZERO, as we have no 1 here which may give us a value by left shifing zeroes.
                As the carry variable is now Zero, we come to the end of recursion and the XORed value will be the Sum, which is 11 (1011 in Binary).



                Hope you get the working of the procedure. You can learn more by learning bitwise operation, as its the way the machine do the arithmatic operations.






                share|improve this answer




























                  1












                  1








                  1







                   int result = p ^ q; // XOR Operator, + without carry 0+0=0, 0+1=1+0=1, 1+1=0
                  int carry = (p & q) << 1; // Left Shift, 1+1=2
                  if (carry != 0) {
                  return getSum(result, carry);
                  }
                  return result;


                  Start By p=5,q=6. Then the XOR would be,



                  0101
                  0110
                  ------
                  0011


                  So, XORing results in (0011) which is actually 3 in decimal. Then ANDing p and q we get,



                  0101
                  0110
                  -------
                  0100


                  We get 4 (100 in binary) by ANDing 5 & 6, now if we left shift this value by 1, we get



                   0100<<1=1000


                  So we get 8 (1000 in binary) after first recursion.As the result (carry variable) isnt zero, lets recursion again by xor value and carry value.



                  getSum(3, 8);


                  So, doing the first XORing we get,



                  0011
                  1000
                  -------
                  1011


                  The XORing this time yielded in 11 (1011 binary),so we perform the AND now,



                  0011
                  1000
                  -------
                  0000


                  We get all ZERO for ANDing 3 and 8, so this time the left shift operator also results in ZERO, as we have no 1 here which may give us a value by left shifing zeroes.
                  As the carry variable is now Zero, we come to the end of recursion and the XORed value will be the Sum, which is 11 (1011 in Binary).



                  Hope you get the working of the procedure. You can learn more by learning bitwise operation, as its the way the machine do the arithmatic operations.






                  share|improve this answer















                   int result = p ^ q; // XOR Operator, + without carry 0+0=0, 0+1=1+0=1, 1+1=0
                  int carry = (p & q) << 1; // Left Shift, 1+1=2
                  if (carry != 0) {
                  return getSum(result, carry);
                  }
                  return result;


                  Start By p=5,q=6. Then the XOR would be,



                  0101
                  0110
                  ------
                  0011


                  So, XORing results in (0011) which is actually 3 in decimal. Then ANDing p and q we get,



                  0101
                  0110
                  -------
                  0100


                  We get 4 (100 in binary) by ANDing 5 & 6, now if we left shift this value by 1, we get



                   0100<<1=1000


                  So we get 8 (1000 in binary) after first recursion.As the result (carry variable) isnt zero, lets recursion again by xor value and carry value.



                  getSum(3, 8);


                  So, doing the first XORing we get,



                  0011
                  1000
                  -------
                  1011


                  The XORing this time yielded in 11 (1011 binary),so we perform the AND now,



                  0011
                  1000
                  -------
                  0000


                  We get all ZERO for ANDing 3 and 8, so this time the left shift operator also results in ZERO, as we have no 1 here which may give us a value by left shifing zeroes.
                  As the carry variable is now Zero, we come to the end of recursion and the XORed value will be the Sum, which is 11 (1011 in Binary).



                  Hope you get the working of the procedure. You can learn more by learning bitwise operation, as its the way the machine do the arithmatic operations.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 1 hour ago

























                  answered 1 hour ago









                  Ayan_84Ayan_84

                  520513




                  520513























                      0














                      It's basically replicating the half-adder



                      Adding 2 bits A and B produces 2 outputs: a sum and a carry bit like below



                      ╔═══════╤═════════════╗
                      ║ Input │ Output ║
                      ╠═══╤═══╪═══════╤═════╣
                      ║ A │ B │ carry │ sum ║
                      ╟───┼───┼───────┼─────╢
                      ║ 0 │ 0 │ 0 │ 0 ║
                      ╟───┼───┼───────┼─────╢
                      ║ 1 │ 0 │ 0 │ 1 ║
                      ╟───┼───┼───────┼─────╢
                      ║ 0 │ 1 │ 0 │ 1 ║
                      ╟───┼───┼───────┼─────╢
                      ║ 1 │ 1 │ 1 │ 0 ║
                      ╚═══╧═══╧═══════╧═════╝


                      From the table we get the logic for the outputs: carry = A and B, sum = A xor B





                      So the snippet above is working like this



                      const Sum=a^b;              // sum = a xor b
                      const carry=(a&b)<<1; // carry = 2*(a and b), since we carry to the next bit
                      if(!carry){
                      return Sum; // no carry, so sum + carry = sum
                      }
                      return getSum(Sum,carry); // a + b = sum + carry


                      See also




                      • Adding two numbers without + operator (Clarification)

                      • What is the best way to add two numbers without using the + operator?

                      • adds two numbers without using + or any arithmetic operators

                      • Adding two numbers without using the addition operator





                      share




























                        0














                        It's basically replicating the half-adder



                        Adding 2 bits A and B produces 2 outputs: a sum and a carry bit like below



                        ╔═══════╤═════════════╗
                        ║ Input │ Output ║
                        ╠═══╤═══╪═══════╤═════╣
                        ║ A │ B │ carry │ sum ║
                        ╟───┼───┼───────┼─────╢
                        ║ 0 │ 0 │ 0 │ 0 ║
                        ╟───┼───┼───────┼─────╢
                        ║ 1 │ 0 │ 0 │ 1 ║
                        ╟───┼───┼───────┼─────╢
                        ║ 0 │ 1 │ 0 │ 1 ║
                        ╟───┼───┼───────┼─────╢
                        ║ 1 │ 1 │ 1 │ 0 ║
                        ╚═══╧═══╧═══════╧═════╝


                        From the table we get the logic for the outputs: carry = A and B, sum = A xor B





                        So the snippet above is working like this



                        const Sum=a^b;              // sum = a xor b
                        const carry=(a&b)<<1; // carry = 2*(a and b), since we carry to the next bit
                        if(!carry){
                        return Sum; // no carry, so sum + carry = sum
                        }
                        return getSum(Sum,carry); // a + b = sum + carry


                        See also




                        • Adding two numbers without + operator (Clarification)

                        • What is the best way to add two numbers without using the + operator?

                        • adds two numbers without using + or any arithmetic operators

                        • Adding two numbers without using the addition operator





                        share


























                          0












                          0








                          0







                          It's basically replicating the half-adder



                          Adding 2 bits A and B produces 2 outputs: a sum and a carry bit like below



                          ╔═══════╤═════════════╗
                          ║ Input │ Output ║
                          ╠═══╤═══╪═══════╤═════╣
                          ║ A │ B │ carry │ sum ║
                          ╟───┼───┼───────┼─────╢
                          ║ 0 │ 0 │ 0 │ 0 ║
                          ╟───┼───┼───────┼─────╢
                          ║ 1 │ 0 │ 0 │ 1 ║
                          ╟───┼───┼───────┼─────╢
                          ║ 0 │ 1 │ 0 │ 1 ║
                          ╟───┼───┼───────┼─────╢
                          ║ 1 │ 1 │ 1 │ 0 ║
                          ╚═══╧═══╧═══════╧═════╝


                          From the table we get the logic for the outputs: carry = A and B, sum = A xor B





                          So the snippet above is working like this



                          const Sum=a^b;              // sum = a xor b
                          const carry=(a&b)<<1; // carry = 2*(a and b), since we carry to the next bit
                          if(!carry){
                          return Sum; // no carry, so sum + carry = sum
                          }
                          return getSum(Sum,carry); // a + b = sum + carry


                          See also




                          • Adding two numbers without + operator (Clarification)

                          • What is the best way to add two numbers without using the + operator?

                          • adds two numbers without using + or any arithmetic operators

                          • Adding two numbers without using the addition operator





                          share













                          It's basically replicating the half-adder



                          Adding 2 bits A and B produces 2 outputs: a sum and a carry bit like below



                          ╔═══════╤═════════════╗
                          ║ Input │ Output ║
                          ╠═══╤═══╪═══════╤═════╣
                          ║ A │ B │ carry │ sum ║
                          ╟───┼───┼───────┼─────╢
                          ║ 0 │ 0 │ 0 │ 0 ║
                          ╟───┼───┼───────┼─────╢
                          ║ 1 │ 0 │ 0 │ 1 ║
                          ╟───┼───┼───────┼─────╢
                          ║ 0 │ 1 │ 0 │ 1 ║
                          ╟───┼───┼───────┼─────╢
                          ║ 1 │ 1 │ 1 │ 0 ║
                          ╚═══╧═══╧═══════╧═════╝


                          From the table we get the logic for the outputs: carry = A and B, sum = A xor B





                          So the snippet above is working like this



                          const Sum=a^b;              // sum = a xor b
                          const carry=(a&b)<<1; // carry = 2*(a and b), since we carry to the next bit
                          if(!carry){
                          return Sum; // no carry, so sum + carry = sum
                          }
                          return getSum(Sum,carry); // a + b = sum + carry


                          See also




                          • Adding two numbers without + operator (Clarification)

                          • What is the best way to add two numbers without using the + operator?

                          • adds two numbers without using + or any arithmetic operators

                          • Adding two numbers without using the addition operator






                          share











                          share


                          share










                          answered 4 mins ago









                          phuclvphuclv

                          15.2k853228




                          15.2k853228























                              -1














                              These are bitwise operations. They're close to hardware language.






                              share|improve this answer



















                              • 7





                                Too short.You didn't explain why this works and how

                                – Jacky
                                1 hour ago






                              • 1





                                Link-only answers are discouraged here. Please add the relevant content in the answer itself.

                                – Ian McLaird
                                1 hour ago






                              • 3





                                It’s binary math. WofWca would have to give you a very very long explanation on binary to explain it. You should really read the W3 Schools article or watch some videos on Bitwise calculations. It’s the kind of thing that would be a few days of class work in college. The comment about link-only answers is fair, but I doubt you’ll grasp the concept from a StackOverflow post alone though.

                                – Nate
                                1 hour ago








                              • 1





                                @IanMcLaird It's not a link-only answer. The link content ("bitwise operations") is sufficient as an answer. Similar to an answer such as "Use the method abc.def.xyz".

                                – user202729
                                42 mins ago






                              • 2





                                @Jacky You didn't say that you don't know those, did you? If you had known what bitwise operations are, this answers would be sufficient (which may happen in case you are familiar with bitwise operations in another language, and don't know where to find the documentation and is completely unfamiliar with JS)

                                – user202729
                                40 mins ago
















                              -1














                              These are bitwise operations. They're close to hardware language.






                              share|improve this answer



















                              • 7





                                Too short.You didn't explain why this works and how

                                – Jacky
                                1 hour ago






                              • 1





                                Link-only answers are discouraged here. Please add the relevant content in the answer itself.

                                – Ian McLaird
                                1 hour ago






                              • 3





                                It’s binary math. WofWca would have to give you a very very long explanation on binary to explain it. You should really read the W3 Schools article or watch some videos on Bitwise calculations. It’s the kind of thing that would be a few days of class work in college. The comment about link-only answers is fair, but I doubt you’ll grasp the concept from a StackOverflow post alone though.

                                – Nate
                                1 hour ago








                              • 1





                                @IanMcLaird It's not a link-only answer. The link content ("bitwise operations") is sufficient as an answer. Similar to an answer such as "Use the method abc.def.xyz".

                                – user202729
                                42 mins ago






                              • 2





                                @Jacky You didn't say that you don't know those, did you? If you had known what bitwise operations are, this answers would be sufficient (which may happen in case you are familiar with bitwise operations in another language, and don't know where to find the documentation and is completely unfamiliar with JS)

                                – user202729
                                40 mins ago














                              -1












                              -1








                              -1







                              These are bitwise operations. They're close to hardware language.






                              share|improve this answer













                              These are bitwise operations. They're close to hardware language.







                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered 1 hour ago









                              WofWcaWofWca

                              40819




                              40819








                              • 7





                                Too short.You didn't explain why this works and how

                                – Jacky
                                1 hour ago






                              • 1





                                Link-only answers are discouraged here. Please add the relevant content in the answer itself.

                                – Ian McLaird
                                1 hour ago






                              • 3





                                It’s binary math. WofWca would have to give you a very very long explanation on binary to explain it. You should really read the W3 Schools article or watch some videos on Bitwise calculations. It’s the kind of thing that would be a few days of class work in college. The comment about link-only answers is fair, but I doubt you’ll grasp the concept from a StackOverflow post alone though.

                                – Nate
                                1 hour ago








                              • 1





                                @IanMcLaird It's not a link-only answer. The link content ("bitwise operations") is sufficient as an answer. Similar to an answer such as "Use the method abc.def.xyz".

                                – user202729
                                42 mins ago






                              • 2





                                @Jacky You didn't say that you don't know those, did you? If you had known what bitwise operations are, this answers would be sufficient (which may happen in case you are familiar with bitwise operations in another language, and don't know where to find the documentation and is completely unfamiliar with JS)

                                – user202729
                                40 mins ago














                              • 7





                                Too short.You didn't explain why this works and how

                                – Jacky
                                1 hour ago






                              • 1





                                Link-only answers are discouraged here. Please add the relevant content in the answer itself.

                                – Ian McLaird
                                1 hour ago






                              • 3





                                It’s binary math. WofWca would have to give you a very very long explanation on binary to explain it. You should really read the W3 Schools article or watch some videos on Bitwise calculations. It’s the kind of thing that would be a few days of class work in college. The comment about link-only answers is fair, but I doubt you’ll grasp the concept from a StackOverflow post alone though.

                                – Nate
                                1 hour ago








                              • 1





                                @IanMcLaird It's not a link-only answer. The link content ("bitwise operations") is sufficient as an answer. Similar to an answer such as "Use the method abc.def.xyz".

                                – user202729
                                42 mins ago






                              • 2





                                @Jacky You didn't say that you don't know those, did you? If you had known what bitwise operations are, this answers would be sufficient (which may happen in case you are familiar with bitwise operations in another language, and don't know where to find the documentation and is completely unfamiliar with JS)

                                – user202729
                                40 mins ago








                              7




                              7





                              Too short.You didn't explain why this works and how

                              – Jacky
                              1 hour ago





                              Too short.You didn't explain why this works and how

                              – Jacky
                              1 hour ago




                              1




                              1





                              Link-only answers are discouraged here. Please add the relevant content in the answer itself.

                              – Ian McLaird
                              1 hour ago





                              Link-only answers are discouraged here. Please add the relevant content in the answer itself.

                              – Ian McLaird
                              1 hour ago




                              3




                              3





                              It’s binary math. WofWca would have to give you a very very long explanation on binary to explain it. You should really read the W3 Schools article or watch some videos on Bitwise calculations. It’s the kind of thing that would be a few days of class work in college. The comment about link-only answers is fair, but I doubt you’ll grasp the concept from a StackOverflow post alone though.

                              – Nate
                              1 hour ago







                              It’s binary math. WofWca would have to give you a very very long explanation on binary to explain it. You should really read the W3 Schools article or watch some videos on Bitwise calculations. It’s the kind of thing that would be a few days of class work in college. The comment about link-only answers is fair, but I doubt you’ll grasp the concept from a StackOverflow post alone though.

                              – Nate
                              1 hour ago






                              1




                              1





                              @IanMcLaird It's not a link-only answer. The link content ("bitwise operations") is sufficient as an answer. Similar to an answer such as "Use the method abc.def.xyz".

                              – user202729
                              42 mins ago





                              @IanMcLaird It's not a link-only answer. The link content ("bitwise operations") is sufficient as an answer. Similar to an answer such as "Use the method abc.def.xyz".

                              – user202729
                              42 mins ago




                              2




                              2





                              @Jacky You didn't say that you don't know those, did you? If you had known what bitwise operations are, this answers would be sufficient (which may happen in case you are familiar with bitwise operations in another language, and don't know where to find the documentation and is completely unfamiliar with JS)

                              – user202729
                              40 mins ago





                              @Jacky You didn't say that you don't know those, did you? If you had known what bitwise operations are, this answers would be sufficient (which may happen in case you are familiar with bitwise operations in another language, and don't know where to find the documentation and is completely unfamiliar with JS)

                              – user202729
                              40 mins ago


















                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55193135%2fwhat-is-ab-and-ab1%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              How to label and detect the document text images

                              Vallis Paradisi

                              Tabula Rosettana