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;
}

猜你喜欢

转载自www.cnblogs.com/zhanggaofeng/p/12063518.html