JAVA二进制转有符号整型

这是一个关于二进制与有符号整型转换的Java代码实现,包括二进制原码和补码转十进制的方法。博客详细讲解了如何处理负数的转换,并提供了取反和求补码的辅助函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 算子 二进制转有符号整型
 */
public class BinaryToSigned {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        String a = SystemUtil.hexString2binaryString("ffffff2a");
        String oppositeCode = ORGBinToDec("11100110",true);

        ///
        String oppositeCode2 = AddBinToDec("11100110",true);


        System.out.println(ORGBinToDec(a,true));
        System.out.println(AddBinToDec(a,true));
    }

    /**
     * 2进制原码 转 十进制
     * @param binaryStr 2进制原码
     * @param includeSymbol 是否区分符号位
     * @return
     */
    public static String ORGBinToDec(String binaryStr, boolean includeSymbol) {
        String result = "";
        //有符号且符号为1,负数时特殊处理
        if (includeSymbol && binaryStr.charAt(0) == '1') {
            result = "-"+Integer.parseInt(binaryStr.substring(1), 2);
        } else {
            int i = Integer.parseInt(binaryStr, 2);
            result = String.valueOf(i);
        }
        return result;
    }

    /**
     * 2进制补码 转 十进制
     * 一般用这个 正数在计算机中原码补码相同 负数在计算机中以补码存储  可以理解为都是按照补码存储的
     *11100110   真值-26
     * @param binaryStr 2进制补码
     * @param includeSymbol 是否区分符号位
     * @return
     */
    public static String AddBinToDec(String binaryStr, boolean includeSymbol) {
        String result = "";
        //有符号且符号为1,负数时特殊处理
        if (includeSymbol && binaryStr.charAt(0) == '1') {
            result = negativeBinToDec(binaryStr);
        } else {
            int i = Integer.parseInt(binaryStr, 2);
            result = String.valueOf(i);
        }
        return result;
    }

    /**
     * 2进制负数转10进制
     *
     * @param binaryStr
     * @return
     */
    public static String negativeBinToDec(String binaryStr) {
        //获取反码
        String oppositeCode =  getOppositeCode(binaryStr);
        //取反
        String negateBinary  = getNegate(oppositeCode);
        //转十进制带符号
        String result = "-"+Integer.parseInt(negateBinary, 2);
        return result;
    }

    /**
     * 补码 -> 反码
     *
     * @param binaryStr
     * @return
     */
    public static String getOppositeCode(String binaryStr) {
        /**
         * 补码减1,得反码;
         * 1.末尾为1,反码:末尾变0,其他位不变
         * 2.末尾为0,
         */
        int down = 0;
        int len = binaryStr.length();
        StringBuffer oppositeCode = new StringBuffer();
        if (binaryStr.charAt(len - 1) == '1') {
            oppositeCode = oppositeCode.append(binaryStr.substring(0, len - 1) + "0");
            return oppositeCode.toString();
        }
        for (int i = len - 1; i >= 0; i--) {
            if (i == len - 1) {
                oppositeCode.append(1);
                down = 1;
                continue;
            }
            int c =  binaryStr.charAt(i);
            c =Character.getNumericValue(c);
            int m = c - down;
            if (m == 0) {
                oppositeCode.append(0);
                down = 0;
                continue;
            }
            if (m == -1) {
                oppositeCode.append(1);
                down = 1;
                continue;
            }
            if (m == 1) {
                oppositeCode.append(1);
                down = 0;
                continue;
            }
        }
        return oppositeCode.reverse().toString();
    }

    /**
     * 取反
     * @return
     */
    public static String getNegate(String binaryStr){
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < binaryStr.length() ; i++){
            if (binaryStr.charAt(i) == '0'){
                sb.append('1');
            }else {
                sb.append('0');
            }
        }
        return sb.toString();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值