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;
    }
  • 相关阅读:
    41 快速的复制一张表
    4 cdh 5.12 centos 6.10三节点安装
    40 insert语句的锁
    oracle 11g 数据库恢复技术 ---02 控制文件
    05 使用bbed跳过归档恢复数据文件
    Springboot 配置文件与对象之间进行映射之@ConfigurationProperties
    @ConditionalOnProperty来控制Configuration是否生效
    Oracle 服务名/实例名,Service_name 和Sid的区别
    @Value中冒号的作用
    springboot读取配置不存在报错
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/12063518.html
Copyright © 2011-2022 走看看