位移(涉及到二进制中的原码,反码,补码)
⭐必记↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓:
对于有符号的数而言,有以下几点
1.二进制的最高位是符号位:0表示正数,1表示负数(区别1为真,0为假)
2.正数的原码,反码,补码都相同(三合一)
3.负数的反码=他的原码符号位不变,其余位取反(0变1,1变0)
4.负数的补码=他的反码+1
5.0的反码和补码都是0
6.计算机运算以 补码 的形式来运算(方便把正数和负数统一起来)
常见的位运算符:
例子(区分取反和反码):
~2=首先得到2的补码=因为2是正数,所以它的补码等于原码
=四个字节有32位(一个int是4字节,一个字节是八位)
=00000000 00000000 00000000 00000010
=取反得到取反的补码11111111 11111111 11111111 11111101
=补码转原码
=最高位符号数是1
=是负数,先求反码(反码=补码-1)
=11111111 11111111 11111111 11111100
=将反码转为原码10000000 00000000 00000000 00000011
=-3
~-5=4
2&-3=获取2的补码和-3的补码
=2的补码为:00000000 00000000 00000000 00000010,
-3的原码为:10000000 00000000 00000000 00000011,
-3的反码为:11111111 11111111 11111111 11111100,
-3的补码为:11111111 11111111 11111111 11111101,
=按位与得到:00000000 00000000 00000000 00000000,
=0
2|3=3
2^3=1
位运算符和移位运算符(同样是处于补码情况下运算)
>>和<<:算术右移和算术左移
>>算术右移:低位溢出,符号位不变,用符号位补溢出的高位
<<算术左移:符号位不变,低位补0
例子
int a=1>>2; // a相当于1/2/2=0
int b=10>>2; // a相当于10/2/2=2(定义是正数,小数部分丢失)
int c=-1>>2; //如下
-1的原码:10000000 00000000 00000000 00000001
-1的反码:11111111 11111111 11111111 11111110
-1的补码:11111111 11111111 11111111 11111111
-1>>2:(正数左边补0,负数左边补1,右边舍弃)
得到:11111111 11111111 11111111 11111111(已经右移2位,这是补码)
转反码(补码-1):11111111 11111111 11111111 11111110
转原码:10000000 00000000 00000000 00000001
结果为-1
int d=1<<2; //
练习题(答案是白色字体):
~2=-3
2&3=2
2|3=3
~-5=4
13&7=5
5|4=5
-3^3=-2
标签:11111111,反码,00000000,补码,运算符,原码 From: https://www.cnblogs.com/MorningMaple/p/16721134.html