数组转换(二进制-八进制-十六进制)-第6天

本文详细介绍了如何使用数组和查表法实现十进制到二进制、八进制及十六进制的转换,并提供了多种优化方案,包括使用StringBuffer进行字符串反转等技巧。

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

数组转换(二进制-八进制-十六进制)

 

1、数组转换(十进制-二进制)

需求:十进制转换成二进制,并打印出来。

class test

{

         publicstatic void main(String[] args)

         {

                   tobin(6);

         }

         /*十进制转换成二进制*/

         publicstatic void tobin(int num)

         {

                            while(num>0)//这里的局限性是数字大于0

                   {

                            system.out.println(num%2);//取余,并显示

                            num= num / 2;//取下一位。

                   }

         }

}

//打印:

0

1

1

 

通过StringBuffer()内部函数实现:

class test

{

         publicstatic void main(String[] args)

         {

                   tobin(6);

         }

         /*十进制转换成二进制*/

         publicstatic void tobin(int num)

         {

                   StringBuffersb = new StringBuffer();

                            while(num>0)

                   {

                            //system.out.println(num%2);

                            sb.append(num%2);

                            num= num / 2;

                   }

         }

}

//打印:

0

1

1

再对比:

class test

{

         publicstatic void main(String[] args)

         {

                   tobin(6);

         }

         /*十进制转换成二进制*/

         publicstatic void tobin(int num)

         {//StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,生成的对象

                   StringBuffersb = new StringBuffer();//这样初始化出的StringBuffer对象是一个空的对象。即把sb存放在一个容器。而这个容器可以存放字符串

                   while(num>0)

                   {

                            //system.out.println(num%2);

sb.append(num%2);/*append该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

StringBuffersb = new StringBuffer(“abc”);

sb.append(true);//则对象sb的值将变成”abctrue”。*/

 

                            num= num / 2;

                   }

                   system.out.println(sb.reverse());//reverse用于字符串反转.原本是011,反转变成110

         }

}

//打印:

110

 

精简版!!!十进制转换成二进制

Dec2Bin(int num){

         while(num/2>0){

                   sb.append(num%2);

                   sb.reverse();

 

2、数组(查表法:十进制-十六进制)

         //查表法:将所以的元素临时存储起来,建立对应关系。

         每一次&15后的值作为索引去查建立好的表。就可以找对应的元素。

         0       1       2       3       4       5       6       7       8       9       A       B       C       D      E       F(16进制)

         0       1       2       3       4       5       6       7       8       9       10     11     12     13     14     15(10进制,也相当于角标)

         这个表怎么建立呢?

         可以通过数组的形式来定义。

class test

{

         publicstatic void main(String[] args)

         {

                   tohex(60);

         }

 

         publicstatic void tohex(int num)

         {

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         for(intx=0;x<8;x++)

                   {

                   inttemp=num&15;//把temp强制转换成了int型。取num的低四位

                   system.out.println(chs[temp]);//temp作为角标,对应数组中的字符。

                   num=num>>>4;//强制高位补0

                   }

         }

}

//打印:

C

3

0

0

0

0

0

0

 

发现终于出结果了。但是是反着的。想要正过来呢?可以通过StringBuffer reverse功能实现。

但是这个工具还没有学习。

 

所以可以使用已经学习过的容器:数组来完成存储。

class test

{

         publicstatic void main(String[] args)

         {

                   tohex(60);

         }

 

         publicstatic void tohex(int num)

         {

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         //定义一个临时容器。可以存储8个字符,

         char[]arr=new char[8];

         for(intx=0;x<8;x++)

                   {

                   inttemp=num&15;

                   //system.out.println(chs[temp]);

                   arr[x]=chs[temp];

                   num=num>>>4;

                   }

         }

         //把存储数据的arr数据遍历一下。

         for(intx=0;x<arr.length;x++)

         {

                   system.out.print(arr[x]+",");

         }

}

//打印:

C,3,0,0,0,0,0,0,

 

发现终于出结果了。但是是反着的。想要正过来呢?

class test

{

         publicstatic void main(String[] args)

         {

                   tohex(60);

         }

 

         publicstatic void tohex(int num)

         {

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         char[]arr=new char[8];

         for(intx=0;x<8;x++)

                   {

                   inttemp=num&15;

                   arr[x]=chs[temp];

                   num=num>>>4;

                   }

         }

         for(intx=arr.length-1;x>=0;x--)//从角标最大的开始读,相当于倒过来了的意思。

         {

                   system.out.print(arr[x]+",");

         }

}

//打印:

0,0,0,0,0,0,3,C

 

我不想要多余的0,怎么办?

class test

{

         publicstatic void main(String[] args)

         {

                   tohex(60);

         }

 

         publicstatic void tohex(int num)

         {

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         //定义一个临时容器。

         char[]arr=new char[8];//字符数组的默认值为'\u0000',打印的时候显示成空格

         intpos=0;//指针,对应指向有效位的元素。

         while(num!=0)//判断取的低四位不为0,即为有效位。

                   {

                   inttemp=num&15;

                   arr[pos++]=chrs[temp];//相当于arr[0]=C;然后pos++,即pos=1;

                   num=num>>>4;

                   }

         }

         //把存储数据的arr数据遍历一下。

         for(intx=arr.length-1;x>=0;x--)

         {

                   system.out.print(arr[x]+",");

         }

}

//打印:

 , ,, , , ,3,C,

 

怎么去掉空格的值:?

class test

{

         publicstatic void main(String[] args)

         {

                   tohex(60);

         }

 

         publicstatic void tohex(int num)

         {

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         char[]arr=new char[8];//字符数组的默认值为'\u0000',打印的时候显示成空格。

         intpos=0;//指针

         while(num!=0)

                   {

                   inttemp=num&15;

                   arr[pos++]=chrs[temp];

                   num=num>>>4;

                   }

         }

         //把存储数据的arr数据遍历一下。

         for(intx=pos-1;x>=0;x--)// arr[pos++]执行完后,pos会自增1.所以用pos-1取得字符

         {

                   system.out.print(arr[x]+",");

         }

}

//打印:

3,C,

 

class test

{

         publicstatic void main(String[] args)

         {

                   tohex(60);

         }

 

         publicstatic void tohex(int num)

         {

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         //定义一个临时容器。

         char[]arr=new char[8];//字符数组的默认值为'\u0000',打印的时候显示成空格。

         intpos=length-1;//指针

         while(num!=0)

                   {

                   inttemp=num&15;

                   arr[pos--]=chrs[temp];

                   num=num>>>4;

                   }

         }

         system.out.println("pos="+pos);

         for(intx=pos;x<arr.length;x++)

         {

                   system.out.print(arr[x]+",");

         }

}

//打印:

pos=5;

 ,3,C,

 

终极版本!!!!!!!

class test

{

         publicstatic void main(String[] args)

         {

                   tohex(60);

         }

 

         publicstatic void tohex(int num)

         {

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         //定义一个临时容器。

         char[]arr=new char[8];//字符数组的默认值为'\u0000',打印的时候显示成空格。

         intpos=length;//指针

         while(num!=0)

                   {

                   inttemp=num&15;

                   //system.out.println(chs[temp]);

                   arr[--pos]=chrs[temp];//pos先减1,变成arr[7]

                   num=num>>>4;

                   }

         }

         system.out.println("pos="+pos);

         for(intx=pos;x<arr.length;x++)

         {

                   system.out.print(arr[x]+",");

         }

}

//打印:

pos=6;

3,C,

 

 

3、数组查表法(十进制-二进制)

 

class test

{

         publicstatic void main(String[] args)

         {

                   tobin(6);

         }

         publicstatic void tobin(int num)

         {

         char[]chrs={'0','1'};

         //定义一个临时存储容器。

         char[]arr=new char[32];//一个整数32个位,即int型,4个8位。

         //定义一个操作数组的指针

         intpos=arr.length;//指针

         while(num!=0)

                   {

                   inttemp=num&1;//二进制&1,八进制&7,十六进制&15

                   arr[--pos]=chrs[temp];

                   num=num>>>1;

                   }

         }

         //把存储数据的arr数据遍历一下。

         for(intx=0;x<arr.length;x++)

         {

                   system.out.print(arr[x]);

         }

}

//打印:

(这里代表空格)                110

 

4、数组(进制转换优化)

 

class test

{

         publicstatic void main(String[] args)

         {

                   tobin(6);

                   tohex(60);

                   toba(60);

         }

         //十进制转二进制

         publicstatic void tobin(int num)

         {

                   trans(num,1,1);

         }

         //十进制转十六进制

         publicstatic void toba(int num)

         {

                   trans(num,7,3);

         }

         //十进制转十六进制

         publicstatic void tohex(int num)

         {

                   trans(num,15,4);

         }

         publicstatic void trans(int num,int base,int offset)//与的基数base。位移的数offset

         {

         if(num==0)

                   {       

                            system.out.println(0);//提前判断是否为0

                            return0;

                   }

         char[]chs={'0','1','2','3','4','5','6','7','8','9','A','B'.'C','D','E','F'};

         //定义一个临时存储容器。

         char[]arr=new char[32];//一个int型整数32个位

         //定义一个操作数组的指针

         intpos=arr.length;//指针

         while(num!=0)

                   {

                   inttemp=num&base;

                   arr[--pos]=chrs[temp];

                   num=num>>>offset;

                   }

         }

         //把存储数据的arr数据遍历一下。

         for(intx=pos;x<arr.length;x++)

         {

                   system.out.print(arr[x]);

         }

}

//打印:

110

3C

74

 

 

为了实现C++中的顺序栈来进行十进制八进制二进制十六进制之间的相互转换,我们可以利用栈这种数据结构的特点来完成数值的逐位分解和重建过程。以下是详细的步骤和思路解析: --- ### **核心思想** 1. 利用顺序栈存储数字的每一位,在转换过程中逐步将高位存入栈底,低位存入栈顶; 2. 出栈时按照从高到低的顺序依次取出每位,并组合成目标数系的结果字符串。 --- ### **第1步:定义栈结构体** 我们首先创建一个简单的顺序栈用于存放数字的每一位信息。 ```cpp #define MAX_SIZE 64 // 最大栈容量 struct Stack { char data[MAX_SIZE]; // 使用字符数组存储栈内容(支持各种基数) int top; // 栈顶指针,初始化为-1表示空栈 }; ``` --- ### **第2步:实现栈的操作函数** #### (1)初始化栈: ```cpp void InitStack(Stack *S) { S->top = -1; // 将栈顶指针初始化为-1 } ``` #### (2)入栈操作: ```cpp bool Push(Stack *S, char value) { if (S->top >= MAX_SIZE - 1) { // 栈满检测 return false; } S->data[++(S->top)] = value; // 入栈 return true; } ``` #### (3)出栈操作: ```cpp char Pop(Stack *S) { if (S->top == -1) { // 栈空检测 return '\0'; // 返回空字符表示失败 } return S->data[(S->top)--]; // 出栈并返回值 } ``` --- ### **第3步:编写转换函数** 我们将分别实现从任意进制转为目标进制的功能,这里主要分为两个部分: 1. **整数拆解阶段**:通过模运算获取最低位,并将其压入栈中; 2. **重组阶段**:通过不断弹出栈顶元素生成最终的目标进制字符串。 #### (1)通用进制转换辅助函数 该函数负责把输入的一个非负整数`num`从指定的源进制`fromBase`转化为目标进制`toBase`形式。 ```cpp const char HEX_MAP[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; std::string Convert(int num, int fromBase, int toBase) { Stack stack; InitStack(&stack); // 如果是负数,则取绝对值后再单独处理符号 bool isNegative = false; if (num < 0 && fromBase == 10) { isNegative = true; num = -num; } // 整数拆解阶段 —— 进行余数计算并将结果推入栈内 do { int remainder = num % toBase; if (remainder > 9) { // 十六进制情况特殊处理字母映射 Push(&stack, HEX_MAP[remainder]); } else { Push(&stack, HEX_MAP[remainder]); } num /= toBase; } while (num != 0); // 结果拼装阶段 —— 弹出所有元素构成最终字符串 std::string result; while (stack.top != -1) { result += Pop(&stack); } // 添加正负号标识符 if (isNegative) result.insert(result.begin(), '-'); return result.empty() ? "0" : result; // 特殊处理全零的情况 } ``` #### (2)测试代码段 展示几个常见例子验证上述逻辑是否准确无误地实现了预期功能。 ```cpp #include <iostream> using namespace std; int main(){ cout << Convert(255 , 10 , 2 ) << endl ; // 输出:"11111111" cout << Convert(-255 , 10 , 16 ) << endl;// 输出:"FF" cout << Convert(123 , 10 , 8 ) << endl ; // 输出:"173" return 0 ; } ``` --- ### **关键细节说明** 1. **HEX_MAP 数组作用**: 提供了方便快捷的索引查找表机制,使得对于大于等于 10 的数值能够直接得到对应的英文字符 A~F。 2. **边界条件考量**: - 输入数字为零的情形应该被妥善应对,保证不会因为循环体内除法导致死循环或者错误输出. - 要区分原始给定数是否有负号影响其后续显示样式. 3. 对于浮点型数据未在此处涉及,可以根据需求进一步扩充算法涵盖范围至小数部分。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值