十六进制转换八进制

十六进制转换八进制

运用位运算跟N(=2的n次方)进制占用的位数进行转换,其思想也可以适用于十六进制转换四进制(假如有需要的话)、二进制,还可以用来将八进制转换成十六、四、二进制,或者反向转换,思想都是相同的,上代码先。

package LQBPaper.Part02.Problem06;
/**
 * 十六进制转十进制
 * 1、获得输入的十六进制数字;
 * 2、将获得的十六进制数字字符串转换成字符数组numsChar;
 * 3、将numsChar字符数组中每一位十六进制数字转换成十进制数字,存进numsInt数组中
 * 4、运用进制转换的算法,将所有位数的十六进制最终转换成十进制数字
 */
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  int count = scanner.nextInt();// 获取一个数字,用于确定需要转换的十六进制数的个数
  String[] results = new String[count];// 实例一个用于承接转换后八进制数的数组(或许直接用String数组承接更加好,在GetResult方法中,就不必对结果进行转换,节约资源)
  for (int i = 0; i < results.length; i++) {
   results[i] = GetResult(scanner.next());// 获得转换后的结果
  }
  for (int i = 0; i < results.length; i++) {
   System.out.println(results[i]);
  }
 }
 /**
  * 获取转换后的数字
  * 
  * @param sourceNumber
  *            需要转换的源数字
  * @return 返回转换后的数字,为一个字符串
  */
 public static String GetResult(String sourceNumber) {
  char[] nums = sourceNumber.toCharArray();
  byte[] numsByte = ChangeNumArr(nums);
  ArrayList<Byte> numsArr = new ArrayList<>();
  List<String> resultCell = new LinkedList<>();
  for (int i = numsByte.length - 1; i >= 0; i--) {
   numsArr.add(0, numsByte[i]);
   if (numsArr.size() == 3 || i == 0) {
    String tempResult = GetResultCell(numsArr.toArray(new Byte[0]));
    resultCell.add(0, tempResult);
    numsArr.clear();
   }
  }
  String result = "";
  for (int i = 0; i < resultCell.size(); i++) {
   result = result + resultCell.get(i) + "";
  }
  int count =0;
  for (int i = 0; i < 4; i++) {
   if (result.charAt(i)!='0') {
    break;
   }
   count++;
  }
  
  return String.copyValueOf(result.toCharArray(),count,result.length()-count);
 }
 /**
  * 将需要转换的十六进制的数字每三位分解成一组byte数组,进行转换
  * 该部分运用的是位的运算,十六进制是每四位进1(即1111→F【即15】,再加一则进一变成10【即16】),而八进制则是每三位进1(即111→7,再加一则进一变成10),因此,可以先将十六进制数转换成
  * 二进制数,这里则是直接用位运算即可进行操作,计算机会自动将其转换成二进制数 
  * @param bytes
  *            已经分解开来的十六进制数组,目前是每3位十六进制转换成最多4位8进制的数字,byte数组的数字不能超过15,否则会溢出,这里不做异常的产生与处理
  * @return 返回已经转换好的8进制数字
  */
 public static String GetResultCell(Byte... bytes) {
  int tempCell = 0;
  String cell = "";
  for (int i = 0; i < bytes.length; i++) {
   tempCell = tempCell << 4;//将3个十进制数byte压进int中,方便进行二进制数转换成八进制数。(为什么是3?因为3与4的最小公约数为123位16进制的数刚好是12个位,刚好可以转换成4位8进制数)
   tempCell = tempCell ^ bytes[i];
  }
  for (int i = 0; i < 4; i++) {
   cell = (tempCell & 7) + cell;
   tempCell = tempCell >> 3;
  }
  return cell;
 }
/**
 * 将number的char数组转换成byte数组
 * @param nums 需要转换的字符数字的数组
 * @return 返回转换好的byte数字的数组
 */
 public static byte[] ChangeNumArr(char[] nums) {
  byte[] numsByte = new byte[nums.length];
  for (int i = 0; i < numsByte.length; i++) {
   numsByte[i] = SwitchCharToByte(nums[i]);
  }
  return numsByte;
 }
/**
 * 将字符数字转换成byte,例如:'1'→1,'2'→2
 * @param ch 需要转换的字符数字
 * @return  返回转换好的byte数字
 */
 public static byte SwitchCharToByte(char ch) {
  switch (ch) {
  case '1':
   return 1;
  case '2':
   return 2;
  case '3':
   return 3;
  case '4':
   return 4;
  case '5':
   return 5;
  case '6':
   return 6;
  case '7':
   return 7;
  case '8':
   return 8;
  case '9':
   return 9;
  case 'A':
   return 10;
  case 'B':
   return 11;
  case 'C':
   return 12;
  case 'D':
   return 13;
  case 'E':
   return 14;
  case 'F':
   return 15;
  }
  return 0;
 }
}

第一次写,如果有不对的,或者有更好的方法的欢迎来指正,谢谢,不喜勿喷,我是菜鸟……夜已深,晚安,各位好梦。

如果是要用的话,最好还是用这个博主使用的Java内置的转换方法:http://my.oschina.net/thinkerfan/blog/96102,更加方便……

转载于:https://my.oschina.net/MyRightStyle/blog/197993

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将十六进制数转换为八进制数,可以先将十六进制数转换为二进制数,然后将二进制数转换为八进制数。 首先,我们将十六进制数的每一位转换为四位的二进制数。例如,十六进制数A转换为二进制数1010,十六进制数B转换为二进制数1011,以此类推。这样,我们就得到了对应的二进制数。 接下来,我们将得到的二进制数从右往左每三位进行分组,然后将每组转换为对应的八进制数。例如,二进制数1010可以分组为10和10,分别转换为对应的八进制数2和2。最后将这些八进制数连在一起,就得到了对应的八进制数。 需要注意的是,输入的十六进制数不会有前导0,输出的八进制数也不能有前导0。同时,输入的十六进制数长度不超过100000。 请根据上述步骤进行转换,得到对应的八进制数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [[C++] 十六进制转八进制](https://blog.csdn.net/summer_dew/article/details/82081406)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [c++ 进制转换 十六进制转八进制](https://blog.csdn.net/CK__CSDN/article/details/104877692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值