package Binary;
import java.util.Scanner;
/**
* 将任意数转换为十六进制
* 思想:
* 1、先获得任意数 num
* 2、通过&运算,对每4个二进制位和二进制1111(十进制的15)运算,获取一次值。注意:取出的只是num二进制的最后4位
* 3、再取4位,需要到无符号右移运算 num>>>4,然后进行循环
* 4、将取出的值放到容器中,初步断定容器为int[],发现十六进制有子母,所以容器为char[]
* 5、循环出来的是十六进制的倒序,并且包含了10-15数字,将其转换为a-f
* 6、0+'0'输出是值,将其强转char类型,则为字符'0',则'0'只要加1-9之间的数字,再强转即为生成的字符'0'-'9'
* 7、这样就取出了num的十六进制所有数字,并将其转成了有a-f可识别的十六进制,只要倒序输出即可
* 8、输出发现,前边数值可能都是0,需将'0'去掉。通过if判断语句,当迭代出的数据不为'0'时,记录当前的下标,以此下标为字符长,进行
* 循环输出。
* 9、特殊情况,当输入值为0时,怎么办。多种测试,发现循环内的if语句判定不了,只能在num初始时进行判断
* 10、以上将很好的输出所有的十六进制数字,只要加上0x即可。
* @author Shoulder
*
*/
public class BinaryToHex {
public static void main(String[] args) {
while(true)
{
System.out.println("转换十六进制");
System.out.println("请输入要转变的值:");
Scanner sc= new Scanner(System.in);
int num = sc.nextInt(); //获得输入值
int end_num = num; //记录控制台输入的数字
if(num==0) //当输入值为0时,直接输出
{
System.out.println(num+"--转十六进制--0x0");
}else{
int temp = 0; //记录4个二进制转换为十六进制生成的数
char[] arr = new char[8]; //以字符数组类型记录转换成的十六进制(int32位,生成8个数字)
for(int i=0;i<8;i++)
{
//4个二进制转换为十六进制。为了取出4位值,num&1111即是
temp = num&15;
//System.out.println(temp);
//由于十六进制是从'0'-'9' 'a'-'f',生成的temp是int型,怎么转换呢,我们想到了ASCII码
if(temp>9)
{ //大于9的数字,'a'为固定值,若打'a'-'f',则需要1-6值,所以要-10,然后类似<9的方式
temp = (char)(temp-10+'a');
//System.out.println((char)(temp-10+'a'));
}else{
//小于9的数字,'0'的值为固定值,当0-9加'0'时,为固定值+(0-9),
//所以转换为char类型时,为字符'0'-'9'
temp = (char)(temp+'0');
}
arr[i] = (char)(temp);
num = num>>>4; //虽然记录了最后的4位,单原值没变,所以需要右移,记录下一个四位
//System.out.println(num);
//temp = num&15;
//System.out.println(temp);
//System.out.println("----");
}
System.out.print(end_num+"--转十六进制--0x");
//由于生成的数组是十六进制的倒序,所以倒序输出
for(int i=arr.length-1;i>=0;i--)
{
//System.out.print(arr[i]);
//如果前位'0',则运行,知道第一位不为'0'的字符
if(arr[i]!='0')
{
for(int j=i;j>=0;j--)
{
System.out.print(arr[j]);
}
//输出一次就终止循环,因为已取出所有的值
break;
}
}
System.out.println();
}
}
//System.out.println();
//System.out.println((char)(0+'0'));
//System.out.println(Integer.toHexString(0));
}
}
将任意数转换为十六进制
最新推荐文章于 2021-08-29 19:03:53 发布