C語言 按位異或實現加法


/* C語言 按位異或實現加法 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void test1()
{
    int a = 2;
    int b = 3;
    int cand = 0;
    int cxor = 0;
    int c = 0;

    //實現c=a+b

    //1.不考慮進位,按位計算各位累加(用異或實現),得到值xor;
    cxor = a^b;
    /*
    實現說明:
        a的值是2,對應計算機中補碼是 0000 0000 0000 0000 0000 0000 0000 0010
        b的值是3,對應計算機中補碼是 0000 0000 0000 0000 0000 0000 0000 0011
        a^b即
        0000 0000 0000 0000 0000 0000 0000 0010
        0000 0000 0000 0000 0000 0000 0000 0011
        0000 0000 0000 0000 0000 0000 0000 0001    --->異或結果
    */

    //2.考慮進位,進行位與運算之后,結果左移1位
    cand = a&b;
    /*
    實現說明:
        a的值是2,對應計算機中補碼是 0000 0000 0000 0000 0000 0000 0000 0010
        b的值是3,對應計算機中補碼是 0000 0000 0000 0000 0000 0000 0000 0011
        a^b即
        0000 0000 0000 0000 0000 0000 0000 0010
        0000 0000 0000 0000 0000 0000 0000 0011
        0000 0000 0000 0000 0000 0000 0000 0010    --->與結果
        0000 0000 0000 0000 0000 0000 0000 0100    --->與結果左移1位,即cand的值
    */

    //3.進行求和計算
    c = cxor + (cand << 1);

    /*
    實現說明:
        0000 0000 0000 0000 0000 0000 0000 0001    --->異或結果
        0000 0000 0000 0000 0000 0000 0000 0100    --->與結果左移1位,即cand的值
        0000 0000 0000 0000 0000 0000 0000 0101    --->最終結果是5
    */

    printf("--test1--c[%d]--\n", c);
}

void test2()
{
    int a = -2;
    int b = 3;
    int cand = 0;
    int cxor = 0;
    int c = 0;

    //實現c=a+b

    //1.不考慮進位,按位計算各位累加(用異或實現),得到值xor;
    cxor = a^b;
    /*
    實現說明:
        a的值是2,對應計算機中補碼是 1 111 1111 1111 1111 1111 1111 1111 1110
        b的值是3,對應計算機中補碼是 0 000 0000 0000 0000 0000 0000 0000 0011
        a^b即
        1 111 1111 1111 1111 1111 1111 1111 1110
        0 000 0000 0000 0000 0000 0000 0000 0011
        1 111 1111 1111 1111 1111 1111 1111 1101    --->異或結果
    */

    //1.考慮進位,進行位與運算之后,結果左移1位
    cand = a&b;
    /*
    實現說明:
        a的值是2,對應計算機中補碼是 1 111 1111 1111 1111 1111 1111 1111 1110
        b的值是3,對應計算機中補碼是 0 000 0000 0000 0000 0000 0000 0000 0011
        a^b即
        1 111 1111 1111 1111 1111 1111 1111 1110
        0 000 0000 0000 0000 0000 0000 0000 0011
        0 000 0000 0000 0000 0000 0000 0000 0010    --->與結果
        0 000 0000 0000 0000 0000 0000 0000 0100    --->與結果左移1位,即cand的值
    */

    //3.進行求和計算
    c = cxor + (cand << 1);

    /*
    實現說明:
        1 111 1111 1111 1111 1111 1111 1111 1101    --->異或結果
        0 000 0000 0000 0000 0000 0000 0000 0100    --->cand的值
        0 000 0000 0000 0000 0000 0000 0000 0001    --->最終結果是1
    */

    printf("--test2--c[%d]--\n", c);
}


int main()
{
    test1();
    test2();
    printf("--------ok-------\n");
    getchar();
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM