十进制、二进制补码、16进制补码的转换

十进制、二进制补码、16进制补码的转换今天一场技术笔试一道编程题难住了我 算出一个十进制数的二进制补码和对应的 16 进制 由于时间紧张 加上紧张 做的极差 因此 mark 以下

十进制转二进制补码

首先要明确的是:十进制直接转成二进制是转化为二进制原码,正数的原码和补码相同,但负数的原码按位取反末位加一才是补码。
因此流程图大概如下:
在这里插入图片描述




整个代码我贴在最后

主要逻辑代码:

public static String convert(int num) { 
    StringBuilder resultString = new StringBuilder(); // 初始化补码数组,共12位 String[] complementStrings = new String[] { 
    "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" }; boolean ifNegative = false; if (num < 0) { 
    complementStrings[0] = "1"; num = -num; ifNegative = true; } // 加入到补码的数组中,开头从12-strings.length开始 String[] strings = Integer.toString(num, 2).split(""); // 对应在strings数组中的下标 int j = 0; for (int i = 12 - strings.length; i < 12; i++) { 
    complementStrings[i] = strings[j]; j++; } // 如果为负数,先全部取反,否则直接拼接 if (ifNegative) { 
    for (int i = 1; i < complementStrings.length; i++) { 
    if (complementStrings[i].equals("1")) { 
    complementStrings[i] = "0"; } else { 
    complementStrings[i] = "1"; } } // 送进函数加一 resultString.append(binaryPlusOne(complementStrings, 11, 1)); } else { 
    resultString.append(strings.toString()); } return resultString.toString(); } 

重要代码1:末位加一

为递归算法,递归逻辑为每次将一位执行与进位的加法并拼接,走完整个数组,返回。

 / * * @param strings 二进制数数组 * @param temp 对哪一位执行加法 * @param carry 进位值 */ private static String binaryPlusOne(String[] strings, int temp, int carry) { 
    if (temp < 0) { 
    StringBuilder tempBuilder = new StringBuilder(); for (int i = 0; i < strings.length; i++) { 
    tempBuilder.append(strings[i]); } return tempBuilder.toString(); } else { 
    // 计算加上进位后的值 int tempInt = Integer.parseInt(strings[temp]) + carry; // 更新对应位置上的值 strings[temp] = String.valueOf(tempInt % 2); // 更新进位 carry = (tempInt) / 2; // 更新坐标 temp--; } return binaryPlusOne(strings, temp, carry); } 

二进制转16进制

同样也是递归的思想,每次将二进制字符串最后四位进行转化,并拼接,知道拼完为止。

重要代码

 / * 将二进制转为16进制 * * @param binaryString * @param length * @return */ private static String binaryTo16(String binaryString, int length) { 
    if (length < 4) { 
    return binaryString; } return binaryTo16(binaryString.substring(0, length - 4), length - 4) + binaryTo16Map.get(binaryString.substring(length - 4, length)); } 

总体代码,粘了就能用

输入为一个十进制数(其二进制位数在12位以内)
输出为 12位二进制补码和二进制补码对应的16进制码的拼接(以分号隔开)

示例:

输入:-7 输出:1;FF9 
import java.util.HashMap; public class BinaryCodeTransfer { 
    public final static int totalNumber = 12; public final static HashMap<String, String> binaryTo16Map = new HashMap<String, String>() { 
    { 
    put("0000", "0"); put("0001", "1"); put("0010", "2"); put("0011", "3"); put("0100", "4"); put("0101", "5"); put("0110", "6"); put("0111", "7"); put("1000", "8"); put("1001", "9"); put("1010", "A"); put("1011", "B"); put("1100", "C"); put("1101", "D"); put("1110", "E"); put("1111", "F"); } }; public static void main(String[] args) { 
    System.out.println(convert(-7)); } public static String convertToBase72(int num) { 
    return Integer.toString(num, 2); } public static String convert(int num) { 
    StringBuilder resultString = new StringBuilder(); // 初始化补码数组,共12位 String[] complementStrings = new String[] { 
    "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" }; boolean ifNegative = false; if (num < 0) { 
    complementStrings[0] = "1"; num = -num; ifNegative = true; } // 加入到补码的数组中,开头从12-strings.length开始 String[] strings = Integer.toString(num, 2).split(""); // 对应在strings数组中的下标 int j = 0; for (int i = 12 - strings.length; i < 12; i++) { 
    complementStrings[i] = strings[j]; j++; } // 如果为负数,先全部取反,否则直接拼接 if (ifNegative) { 
    for (int i = 1; i < complementStrings.length; i++) { 
    if (complementStrings[i].equals("1")) { 
    complementStrings[i] = "0"; } else { 
    complementStrings[i] = "1"; } } // 送进函数加一 resultString.append(binaryPlusOne(complementStrings, 11, 1)); } else { 
    resultString.append(strings.toString()); } // 如果大于零直接求出十六进制,否则,放入16进制处理函数中 resultString.append(";").append(binaryTo16(resultString.toString(), 12)); return resultString.toString(); } / * * @param strings * @param temp * @param carry */ private static String binaryPlusOne(String[] strings, int temp, int carry) { 
    if (temp < 0) { 
    StringBuilder tempBuilder = new StringBuilder(); for (int i = 0; i < strings.length; i++) { 
    tempBuilder.append(strings[i]); } return tempBuilder.toString(); } else { 
    // 计算加上进位后的值 int tempInt = Integer.parseInt(strings[temp]) + carry; // 更新对应位置上的值 strings[temp] = String.valueOf(tempInt % 2); // 更新进位 carry = (tempInt) / 2; // 更新坐标 temp--; } return binaryPlusOne(strings, temp, carry); } / * 将二进制转为16进制 * * @param binaryString * @param length * @return */ private static String binaryTo16(String binaryString, int length) { 
    if (length < 4) { 
    return binaryString; } return binaryTo16(binaryString.substring(0, length - 4), length - 4) + binaryTo16Map.get(binaryString.substring(length - 4, length)); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175975.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:58
下一篇 2026年3月26日 下午10:58


相关推荐

  • navicat ssh通道受限问题处理

    navicat ssh通道受限问题处理

    2021年10月19日
    39
  • python pip升级命令

    python pip升级命令因为pip升级不常用到,所以经常不记得,趁现在记录一下pipinstall–upgradepip

    2022年6月9日
    43
  • can not create this interface_getinterfaces方法

    can not create this interface_getinterfaces方法Androidstudio导入依赖,构建时报错错误如下: StaticinterfacemethodsareonlysupportedstartingwithAndroidN(–min-api24):voidbutterknife.Unbinder.lambda$static$0()Message{kind=ERROR,text=Statici…

    2025年8月31日
    10
  • 电脑广告多?Windows 自带恶意软件删除工具还不会使用?有必要安装杀毒软件吗?

    电脑广告多?Windows 自带恶意软件删除工具还不会使用?有必要安装杀毒软件吗?可能有些小伙伴发现,哎?为什么我的电脑弹窗广告这么多?难不成小视频看多了?电脑中毒了?Windows系统自带的恶意软件删除工具你还不会使用?今天我们一方面带领大家学会使用这个系统自带的工具,另一方面,谈一谈作为一个程序员对于恶意软件和杀毒软件的一些看法,希望能帮助大家纠正一些误区。

    2022年6月24日
    36
  • TCP和UDP的区别和优缺点

    TCP和UDP的区别和优缺点1 TCP 与 UDP 区别总结 1 TCP 面向连接 如打电话要先拨号建立连接 UDP 是无连接的 即发送数据之前不需要建立连接 2 TCP 提供可靠的服务 也就是说 通过 TCP 连接传送的数据 无差错 不丢失 不重复 且按序到达 UDP 尽最大努力交付 即不保证可靠交付 Tcp 通过校验和 重传控制 序号标识 滑动窗口 确认应答实现可靠传输 如丢包时的重发控制 还可以对次序乱掉的分包进行顺序控制

    2026年3月19日
    2
  • NSSM使用说明

    NSSM使用说明1、说明NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行。同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大。它的特点如下:支持普通exe程序(控制台程序或者带界面的Windows程序都可以)安装简单,修改方便可以重定向输出(并且支持Rotation)可以自动守护封装了的…

    2025年8月14日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号