0

我正在编写一个应该在二进制、十进制和十六进制之间转换的代码。我已经计算出了二进制和十进制,但是当我得到十六进制时,我感到很困惑。

如果不使用 Integer.toHexString,你将如何进行这种转换。

我知道在 java 中已经有一个代码可以为我做到这一点,我的困惑是如何告诉 java 使用手动转换来做到这一点。

我的想法是创建多个 if 语句,每个语句都解释 0 是 0000,或者 C 是 1100,以此类推。

它将遍历十六进制字符串中的每个字符并将二进制值加在一起。

我觉得这是我被要求做的很多代码的方式。

除非这是唯一的方法,否则我将开始这样做。

但是如果有一个伪代码可以解释如何更有效地做到这一点,那将不胜感激。

额外信息:

int hexDigit1A=(binaryDigit8%2)*8+(binaryDigit7%2)*4+(binaryDigit6%2)*2+(binaryDigit5%2)*1;
int hexDigit2A=(binaryDigit4%2)*8+(binaryDigit3%2)*4+(binaryDigit2%2)*2+(binaryDigit1%2)*1; 

我知道这会将 4 位二进制数转换为适当的十进制数,这甚至有用还是仅对十进制有用。

非常感谢您提前。

4

3 回答 3

1

我的想法是创建多个 if 语句,每个语句都解释 0 是 0000,或者 C 是 1100,以此类推。

天哪,这一定是有史以来最糟糕的主意。

解决这个问题的关键是理解数字的含义。

例如

十六进制的 A12C 可以表示为

A*16^3 + 1*16^2 + 2*16^1 + C 或 10*16^3 + 1*16^2 + 2*16^1 + 12

然后,您可以设置一个 while 循环并执行一些 div / mod kung fu 来进行转换。

这样,您的转换将适用于任何限制最大 int 限制的数字。

于 2013-04-08T00:00:39.213 回答
1

现代计算机中的所有整数都以硬件和二进制形式表示。十六进制是二进制数的表示,其中每 4 位由一个字符 0-F 表示。所以一个整数是

0100 1100

也可以用十六进制表示为 4C(十进制为 76)。

有两个整数运算可以帮助你。第一个是'and'函数,在java中用一个与号('&')表示。如果你'和'两个整数,一个中的每个位位置都与下一个中的相应位位置相乘;因此,如果你用二进制数“和” 0000 1111,结果将与原始数字的最低 4 位相同。在我们的示例中,结果将是0000 1100。(我们将 0000 1111 称为“掩码”,并表示我们正在掩码低 4 位或掩码高 4 位。)

第二个操作是移位;可以使用 >> 和 << 向右或向左移动。

因此,如果您有一个整数并且想要输出其十六进制等价物,请使用以下循环:

  1. 最右边 4 位的掩码
  2. 将结果转换为 0-F 并存储在某处(将结果用作 char 数组的索引!)
  3. 将原始数据右移 4 位

并尽可能多地执行 4 位分组转换。你得到的结果将是相反的顺序,即你得到的第一个十六进制数字最终在你的十六进制数字的最右边。如果您想调整算法以向前顺序返回数字,请随意!

警告:负数会使这稍微复杂一些,因为移动负数往往会移动“符号位”。在尝试处理负数之前,我不会深入了解所有这些,而是​​先了解一下并理解所有概念。

于 2013-04-08T02:35:57.983 回答
1

这是通过一个简单的映射函数来实现的。当您手动操作时,您将二进制值分成 4 位,对吗?然后为每个“4 位”分配它自己的特定十六进制值。您的算法应该检查您的二进制值,查看每个“4 位”并确定要应用的正确十六进制值。

这看起来像一个实验室,所以这里有一些超级基本的伪代码。

Binary Value
Look at last 4 bits
Map to appropriate Hexadecimal Number
Look at next 4 bits, etc etc.

这应该让您对 Hexadecimal -> Binary 转换的内容有一个足够好的了解。一样的想法!

于 2013-04-08T02:49:42.067 回答