原码:程序猿理理解的二进制码
反码:认为规定的,除了第一位正负标志位以外取反的二进制码
补码:计算机中实际操作的二进制吗
正数 和 负数 的反码和补码的的获取方式是不一样的,根据java的int类型说明。int是32位的。
正数 2 ,正数的 原码、反码、补码一样。
原码:0000 0000 0000 0000 0000 0000 0000 0010
反码:0000 0000 0000 0000 0000 0000 0000 0010
补码:0000 0000 0000 0000 0000 0000 0000 0010
负数 2 ,第一位是标志位,0代表正数,1代表负数。
原码:1000 0000 0000 0000 0000 0000 0000 0010
反码:0111 1111 1111 1111 11111 11111 1111 1101 //除了最高位的标志位不变,其余的取反
补码:0111 1111 1111 1111 11111 11111 1111 1110 //反码+1
&:与运算,同时为1结果是1,否则是0. eg: 1 & 1 = 1 1 & 0 = 0
|: 或运算,有一个为1结果是1,否则是0. eg: 1 | 1 = 1 1 | 0 =1 0 | 0=0
^: 异或运算,两个一样结果是1,否则是0. eg: 1 ^1 = 0 1 ^0 =1 0 ^ 0=0
38 对应的二进制 0000 0000 0000 0000 0000 0000 0010 0110
37 对应的二进制 0000 0000 0000 0000 0000 0000 0010 0101
&后结果36 0000 0000 0000 0000 0000 0000 0010 0100
|后结果39 0000 0000 0000 0000 0000 0000 0010 0111
^后结果3 0000 0000 0000 0000 0000 0000 0000 0011
上面计算的都是正数,所以原码、反码、补码都一样,所以不易要认为全部都不易用原码计算,一定要记住,计算机操作都是计算 补码的。
38 原码、反码、补码都一样
38 0000 0000 0000 0000 0000 0000 0010 0110
-37 原码 1000 0000 0000 0000 0000 0000 0010 0101
-37 反码 1111 1111 1111 1111 1111 1111 1101 1010 //除了最高位 其余的取反
-37 补码 1111 1111 1111 1111 1111 1111 1101 1011 //反码+1
用补码计算 38 & -37 其实是
0000 0000 0000 0000 0000 0000 0010 0110
&
1111 1111 1111 1111 1111 1111 1101 1011
=
0000 0000 0000 0000 0000 0000 0000 0010
转换成十进制 2
计算 ~2
2的原码补码反码都一样
2的补码 0000 0000 0000 0000 0000 0000 0000 0010
取反 1111 1111 1111 1111 1111 1111 1111 1101
取反之后 最高位是1 代表的是负数,所以这个二进制是一个负数的补码,计算出原码,首先负数看怎么计算得到补码。
一、原码 除了 最高的 标志位 其他为取反得到反码。
二、反码 +1 位 得到补码。
倒着推,补码-1位,得到反码
反码 :1111 1111 1111 1111 1111 1111 1111 1100
除了最高位其他取反得原码
原码 :1000 0000 0000 0000 0000 0000 0000 0011
十进制是 -3