zoukankan      html  css  js  c++  java
  • 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]--
    ", 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]--
    ", c);
    }
    
    
    int main()
    {
        test1();
        test2();
        printf("--------ok-------
    ");
        getchar();
        return 0;
    }
  • 相关阅读:

    k
    通过类名调用类方法
    类Area的getArea方法是一个重载方法
    构造cry
    两个lader对象共享bottom
    向一个方法的基本数据类型参数传值
    Circle
    常量的用法
    显示本机时间
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/12063518.html
Copyright © 2011-2022 走看看