• 位运算操作相关示例


    位运算操作主要包括:

    a | b   // 0000 1001 | 0000 0101 == 0000 1101
    a & b   // 0000 1001 & 0000 0101 == 0000 0001
    a ^ b   // 0000 1001 ^ 0000 0101 == 0000 1100 异或运算
    a >> 2  // 0000 1001 >> 2 == 0000 0010 右移
    a << 2  // 0000 1001 << 2 == 0010 0100 左移
    

    1 利用位移实现两个整数的加法运算

    // 2016/8/21
    // 利用位移运算实现两个整数的加法
    int AddBitOperate(int a, int b)
    {
        if (0 == b)
        {
            return a;
        }
        int sum, carry;
        sum = a ^ b;            // 没有进位的加法运算
        carry = (a & b) << 1;   // 进位, 左移
        return AddBitOperate(sum, carry);
    }
    

    2 不用判断语句找两整数最大值

    bool Flag(int a, int b)
    {
        return a > b;
    }
    int Max(int a, int b)
    {
        bool Tag = Flag(a, b);
        return a*Tag + (1-Tag)*b;
    }
    

    3 两个数据的交换

    如果是两个整数可以利用异或运算交换这两个数,不使用多余的内存。

    void swapORX(int& a, int& b)
    {
        cout << "a = " << a << ", b = " << b << endl;
        b = a ^ b;
        a = a ^ b;
        b = b ^ a;
        cout << "a = " << a << ", b = " << b << endl;
    }
    

    对于浮点数,不能进行位运算,可以采用内存交换。

    # define SWAP(a, b) 
    { 
    char tempBuf[10]; 
    memcpy(tempBuf, &a, sizeof(a)); 
    memcpy(a, &b, sizeof(b)); 
    memcpy(b, tempBuf, sizeof(b)); 
    } 
    

    3.1 关于浮点数的存储方式

    在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。

    符号位 阶码 尾数
    float 31 30-23 22-0
    double 63 62-52 51-0

    相关参考:
    浅谈C/C++的浮点数在内存中的存储方式

  • 相关阅读:
    ECNU-2574 Principles of Compiler
    C++调用C#生成的DLL文件的各种问题
    EOJ-1708//POJ3334
    Linux---弹球游戏
    dotfiles管理
    js基础的知识整理
    关于css的一些知识点整理
    HTML5 aria- and role
    JS获取非行间样式
    Javascript中的数组去重-indexof方法
  • 原文地址:https://www.cnblogs.com/nobodyzhou/p/5793643.html
Copyright © 2020-2023  润新知