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

整个代码我贴在最后
主要逻辑代码:
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
