位运算操作相关示例
位运算操作主要包括:
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++的浮点数在内存中的存储方式