二进制运算性质及相关算法
- 1 几个与码相关的术语
- 2 位运算概述
- 3 位运算符的运算率
- 1. 交换律
- 2. 结合律
- 3. 等幂律
- 4.零律
- 4 位运算的高级操作
1 几个与码相关的术语
原码 : 以二进制形式在计算机中存储,数值前直接加一符号位的表示法 1表示负数 0 表示正数
反码 : 正数的反码与原码相同;负数的反码,符号位为 1 1 1,数值部分按位取反。
补码 : 正数的补码和原码相同;负数的补码则是符号位为 1 1 1,数值部分按位取反后再在末位(最低位)加 1 1 1,也就是反码 + 1 +1 +1。
这里以数字7为例
int main()
{// 0111 1111 1111 1111 1111 1111 1111 1111//整数是以源码的形式存储 表示-10int num = 0x0000000A;cout << num << endl;// 负数是以补码的形式存储 -10的表示 补码是原码 按位取反加1num = ~(0x0000000A)+1;//cout << num << endl;int bitNum = 0x07;cout << bitNum << endl;// 7bitNum = (~bitNum) + 1;cout << bitNum << endl; // -7return 0;
}
2 位运算概述
符号 | 描述 | 运算规则 |
| | 按位或 | 两位都是0时结果才是0 |
& | 按位与 | 两位都是1时结果才是1 |
^ | 按位异或 | 两位相同为 0 不同为 1 |
>> | 右移 | 低位丢弃 高位补0 |
<< | 左移 | 高位丢弃 低位补0 |
3 位运算符的运算率
1. 交换律
a a a ∣ | ∣ b b b ∣ | ∣ c c c = = = b b b ∣ | ∣ a a a ∣ | ∣ c c c
a a a ^ b b b ^ c c c = = = b b b ^ a a a ^ c c c
a a a & \& & b b b & \& & c c c = = = b b b & \& & a a a & \& & c c c
2. 结合律
a a a ∣ | ∣ b b b ∣ | ∣ c c c = = = a a a ∣ | ∣ ( b (b (b ∣ | ∣ c ) c) c)
a a a ^ b b b ^ c c c = = = b b b ^ ( a (a (a ^ c ) c) c)
a a a & \& & b b b & \& & c c c = = = b b b & \& & ( a (a (a & \& & c ) c) c)
3. 等幂律
A & A & A = A A \& A \& A = A A&A&A=A
A ∣ A ∣ A = A A | A | A = A A∣A∣A=A
4.零律
A ˆ A = 0 A \^\ A = 0 A ˆA=0
A ˆ 0 = A A \^\ 0 = A A ˆ0=A
A & 0 = 0 A \&\ 0 =0 A& 0=0
A ∣ 0 = A A|0=A A∣0=A
A ∧ 0 = A A∧ 0 = A A∧0=A
int main()
{cout << (3 | 2 | 4) << endl;cout << (2 | 3 | 4 ) << endl;cout << (3 & 2 & 4) << endl;cout << (2 & 3 & 4 ) << endl;cout << (2 ^ 3 ^ 4) << endl;cout << (3 ^ 2 ^ 4) << endl;cout << (10 & 10 & 10) << endl;cout << (10 | 10 | 10) << endl;cout << (10 ^ 10) << endl;
}
4 位运算的高级操作
功能 | 位运算 |
去掉最后一位 | X >> 1 |
在最后加一个0 | X << 1 |
在最后加一个1 | X << 1 + 1 |
最后一位变1 | X | 1 |
最后一位变0 | X | 1 - 1 |
最后一位取反 | X ^ 1 |
把右数第k位变为1 | X ^ ( 1 << (k - 1)) |
把右数第k位变为1 | X ^ ( 1 << (k - 1)) |
把右数第k位变为0 | X & ~( 1 << (k - 1)) |