逻辑运算符:(要在32位的2进制上做运算)
左移:<<
右移:>>
例如:(整数10的32位二进制)
(左边是高位)0000 0000 0000 0000 0000 0000 0000 1010(右边是低位)
原码:就是直观的二进制表示方式
反码:正数:和原码一样
负数:符号位不变,其余位按位取反
补码:正数:和原码一样
负数:符号位不变,反码加一
重点:参与运算的是补码
eg:
左移(<<)的规则:高位丢失,低位补零
int a=10,b;
b=a<<2;//左移两位
10是正数,所以它的补码:0000 0000 0000 0000 0000 0000 0000 1010
结果:0000 0000 0000 0000 0000 0000 0010 1000,等于40
int a=-8,b;
//原码1000 0000 0000 0000 0000 0000 0000 1000
//反码1111 1111 1111 1111 1111 1111 1111 0111
//补码1111 1111 1111 1111 1111 1111 1111 1000(将补码用来运算)
b=a<<3;
结果补码:1111 1111 1111 1111 1111 1111 1100 0000(将补码又当作原码来计算,相当于再求个补码的补码,就是最后得到的数的原码)
结果反码:1000 0000 0000 0000 0000 0000 0011 1111
结果原码:1000 0000 0000 0000 0000 0000 0100 0000(结果等于-64)
右移(>>)的规则:
1.正数:低位丢失,高位补零(和左移一样,都是补0)
2.负数:低位丢失,高位补一
int a=-8,b;
//原码1000 0000 0000 0000 0000 0000 0000 1000
//反码1111 1111 1111 1111 1111 1111 1111 0111
//补码1111 1111 1111 1111 1111 1111 1111 1000
b=a>>3;
结果补码:1111 1111 1111 1111 1111 1111 1111 1111
结果反码:1000 0000 0000 0000 0000 0000 0000 0000
结果原码:1000 0000 0000 0000 0000 0000 0000 0001(结果等于-1)