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;
    }
  • 相关阅读:
    [转]解决ORACEL数据库“exp导出老是出现ORA-00904”
    教程
    [转]web初学者需要掌握哪些技术
    sublime的使用技巧
    安装Sublime Text
    memcached内存分类机制
    Java生产者和消费者
    一致性哈希原理及应用浅析
    Java线程状态分析
    Java多线程中断机制
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/12063518.html
Copyright © 2011-2022 走看看