java中的原码、补码、反码

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=original
		buma=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

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值