• 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

  • 相关阅读:
    729. 我的日程安排表 I :「模拟」&「线段树(动态开点)」&「分块 + 位运算(分桶)」
    机器学习第五课--广告点击率预测项目以及特征选择的介绍
    Linux 安装Nginx详细图解教程
    矩阵分析与应用-03-矩阵的基本运算
    Linux中怎么启动Zookeeper
    【Unity3D】素描特效
    Jetson nano 安装Ubuntu20.04系统
    springboot227旅游管理系统
    UE蓝图学习(从Unity3D而来)
    (十三) minAreaRect函数
  • 原文地址:https://blog.csdn.net/Nicole_d/article/details/139449658