C#中如何实现十进制数16位二进制编码、反转后转新整数
问题需求
- 接收用户输入的整数n,将其转换为固定16位长度的二进制表示,反转该二进制位序列后,再将反转后的二进制解码为新的十进制整数。
- 示例:整数14769的16位二进制为
0011100110110001(前补2个0凑齐16位),反转后二进制为1000110110011100,解码得到的新整数为36252。
现存问题
原有代码转换二进制时以输入值归0作为循环终止条件,不会自动补充高位前导0,仅得到有效位对应的二进制值11100110110001,因缺少高位的2个0,导致反转时丢失对应位,最终解码整数错误。
原有错误实现代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace HelloWorld { public class Program { public static void Main(string[] args) { long n, n1, p, i, r, sum, inv, inv1, newint; Console.WriteLine("give n:"); n=long.Parse(Console.ReadLine()); n1=n; p=1; sum=0; i=n; // 转换输入为二进制表示 for(i=n;i!=0;i=i/2) { r=i%2; sum=sum+r*p; p=p*10; } inv=0; // 反转二进制表示 for(i=sum;i!=0;i=i/10) { r=i%10; inv=10*inv+r; } inv1=inv; newint=0; p=0; // 将反转后的二进制转换为十进制整数 for(i=inv;i!=0;i=i/10) { r=i%10; newint=newint+r*(long)Math.Pow(2,p); p=p+1; } Console.WriteLine("The number that you gave = {0} \nIts binary representation = {1} \n\nThe inverse binary representation = {2} \nThe integer corresponding to the inverse binary number = {3}", n1, sum, inv1, newint); } } }
约束条件
- 不可使用内置转换函数
- 不可使用补位方法、
Convert类相关转换方法 - 仅允许使用for循环(尽量不使用while循环)
- 不允许使用字符串类型,需正确实现16位二进制编码逻辑
实现思路
原有代码的核心错误是所有位处理循环都以数值归0为终止条件,自动丢弃了高位的0。修复逻辑直接对齐16位固定长度要求:所有涉及二进制位处理的环节都固定执行16次循环,无论当前处理的数值是否已经归0,保证高位的0也能参与后续反转、解码计算,全程不使用字符串、内置转换函数,仅通过算术运算和for循环完成逻辑。
正确实现代码
using System; namespace HelloWorld { public class Program { public static void Main(string[] args) { long n, n1, r, originalBin, invBin, newint; Console.WriteLine("give n:"); n = long.Parse(Console.ReadLine()); n1 = n; originalBin = 0; invBin = 0; newint = 0; // 初始化反转后最高位的权重2^15,手动乘2计算避免浮点精度问题 long revBitWeight = 1; for (int i = 0; i < 15; i++) { revBitWeight *= 2; } long originalBinWeight = 1; // 固定循环16次处理所有二进制位,不提前终止 for (int count = 0; count < 16; count++) { r = n % 2; // 取当前最低位 n = n / 2; // 右移一位 // 拼接反转后的二进制十进制表示 invBin = invBin * 10 + r; // 拼接原二进制的十进制表示 originalBin += r * originalBinWeight; originalBinWeight *= 10; // 累加反转后当前位对应的十进制值 newint += r * revBitWeight; revBitWeight /= 2; } Console.WriteLine("The number that you gave = {0} \nIts binary representation = {1} \n\nThe inverse binary representation = {2} \nThe integer corresponding to the inverse binary number = {3}", n1, originalBin, invBin, newint); } } }
验证结果
输入14769时,代码输出:
- 原二进制表示:
11100110110001(高位前导0不影响数值存储,计算时已完整参与运算) - 反转后二进制表示:
1000110110011100 - 最终解码整数:
36252,与示例结果完全一致。
内容的提问来源于stack exchange,提问作者Elie Makdissi
相关产品推荐
相关产品推荐

