位运算
原码、反码、补码
-
对于有符号的而言:最高位表示符号位,0表示正数,1表示负数
1----> 原码 0000 0001
-1----> 原码 1000 0001
-
正数的原码、反码、补码都一样
1----> 反码0000 0001 补码0000 0001
-
负数的反码等于符号位不变,其它位取反
-1----> 反码1111 1110
-
负数的补码等于其反码+1
-1----> 补码 1111 1111
-
0的反码、补码都是0
-
在计算机中的运算都是以补码的方式来运算的
按位与&,或|、异或^
- &:两位全为1,结果为1,否则为0(电路串联)
- |:两位有一个为1,结果为1,否则为0(电路并联)
- ^:两位有一个为1,一个为0,结果为1,否则为0 (同为假,异为真)
左移<<,右移>>
左移运算符 <<: 符号位不变,低位补 0
右移运算符 >>:低位溢出,符号位不变,并用符号位补溢出的高位 (正数补0,负数补1)
#include <iostream>
using std::cout;
using std::endl;
int main()
{
cout << (2&3) << endl;//2
cout << (2|3) << endl;//3
cout << (2^3) << endl;//1
cout << (-2^2) << endl;//-4
cout << (6 << 2) << endl;//24
cout << (-6 << 2) << endl;//-24
cout << (15 >> 2) << endl;//3
cout << (-4 >> 2) << endl;//-1
return 0;
}
2 0000 0010
3 0000 0011
2&3 0000 0010
2|3 0000 0011
2^3 0000 0001
-2^2
先计算-2的补码与2的补码进行异或运算,得到结果的补码,-1得到反码,再符号位不变,其它位取反得到结果的原码
-2 1000 0010(原码)
1111 1101(反码)
1111 1110(补码)
2 0000 0010(原码、反码、补码)
1111 1100(补码)
1111 1011(反码)
1000 0100(原码)
6 << 2 0000 0110(原码)
0001 1000(左移2位,低位补0)
-6 << 2 1000 0110(原码)
1111 1001(反码)
1111 1010(补码)
1110 1000(左移2位,低位补0)
1110 0111(反码)
1001 1000(原码)
15 >> 2 00001111(原码)
00001111(反码)
00001111(补码)
00000011(右移2位,高位补符号位)
00000011(反码)
00000011(原码)
-4 >> 2 10000100(原码)
11111011(反码)
11111100(补码)
11111111(右移2位,高位补符号位)
11111110(-1得到反码)
10000001(原码)