1.原码、反码、补码都是由符号位和其他位构成,符号位表示正负,0为正1为负,其余位表示数值的绝对值,因此正数的原码、反码、补码一致,0的反码、补码都是0。
2.负数的反码在原码的基础上符号位不变,其余位取反
3.负数的补码=反码+1
4.java中的数都是有符号的,计算机运算时都是以补码的方式来运算的(原码–>反码–>补码,计算),看结果时要看原码(补码–>反码–>原码)
转换思路:
原码—>反码:第1位不变,从第2位开始0变1,1变0
反码—>补码:从最低位开始进1,若当前位为0,则进1后停止进位,若当前位为1,则1变0后接着进位,直到遇到0,停止进位
(可以理解为携带的1是否上交出去,只有遇到0才能交出去,遇到1则上交失败,将当前为变为0后继续寻找下一个位置)
public static String originalToComplement(String original)
{
//取符号位char signBit=original.chatAt(0);StringBuilder fanma = new StringBuilder();StringBuilder buma = new StringBuilder();
if signBit=='0':{fanma=originalbuma=original}
else:
{ buma=fanma//反码的基础上,其余位取反for (int i = 1; i < original.length(); i++) {fanma.append(original.charAt(i) == '0' ? '1' : '0');}// 反码+1得到补码int carry = 1;//从最低位开始,遇到1,则把1变0,对下一位+1,若下一位为0,把0变为1,停止进位for (int i = buma.length() - 1; i >= 0; i--) {char bit = buma.charAt(i);if (bit == '0' && carry == 1) {buma.setCharAt(i, '1');carry = 0;} else if (bit == '1' && carry == 1) {buma.setCharAt(i, '0');}}
}
}
计算2&3,2|3,2,2^3,(-2)
获取原码:
2:00000000 00000000 00000000 00000010
3:00000000 00000000 00000000 00000011
-2: 10000000 00000000 00000000 00000010
获取反码:
2:00000000 00000000 00000000 00000010
3:00000000 00000000 00000000 00000011
-2: 11111111 11111111 11111111 11111101
获取补码:
2:00000000 00000000 00000000 00000010
3:00000000 00000000 00000000 00000011
-2: 11111111 11111111 11111111 11111110
补码进行运算后转变为原码得到结果:
2&3=00000000 00000000 00000000 00000010(按位与&,全1为1) ----->原码00000000 00000000 00000000 00000010---->结果 2
2|3 = 00000000 00000000 00000000 00000011(按位或|,有1为1) ----->原码 00000000 00000000 00000000 00000011---->结果 3
2^3= 00000000 00000000 00000000 00000001(按位异或,异为1,同为0) ----->原码00000000 00000000 00000000 00000001---->结果 1
~2 = 11111111 11111111 11111111 11111101(按位取反,0变1,1变0) ----->原码10000000 00000000 00000000 00000011---->结果 -3
~(-2)=00000000 00000000 00000000 00000001(补码)----->原码00000000 00000000 00000000 00000001---->结果 1