位运算操作相关示例

位运算操作主要包括:

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++的浮点数在内存中的存储方式

posted @ 2016-08-21 21:27  NobodyZhou  阅读(244)  评论(0编辑  收藏  举报