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;
    }
  • 相关阅读:
    ZIP压缩算法详细分析及解压实例解释
    nyoj 269 VF
    骨牌覆盖问题 KxM
    骨牌覆盖问题
    省赛总结...
    归并排序求逆序对
    「JLOI2014」松鼠的新家
    「JSOI2011」任务调度
    「JSOI2010」找零钱的洁癖
    「JSOI2011」棒棒糖
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/12063518.html
Copyright © 2011-2022 走看看