从十六进制转换为二进制,反之亦然。困难的方式

时间:2013-04-07 23:48:57

标签: java binary hex

我正在编写一个应该在二进制,十进制和十六进制之间转换的代码。我有二进制和十进制数字,但当我得到十六进制时,我感到很困惑。

如果不使用Integer.toHexString,您将如何进行此转换。

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

我的想法是创建多个if语句,每个语句解释0为0000,或C为110​​0,等等。

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

我觉得这可以通过很多代码来解决我被要求做的事情。

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

但是如果有一个伪代码可以解释如何更有效地做到这一点,那将是值得赞赏的。

额外信息:

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位二进制数转换为适当的小数,这甚至是有用的,或者只对十进制有效。

非常感谢你。

3 个答案:

答案 0 :(得分:1)

  

我的想法是创建多个if语句,每个语句都解释为0   0000,或C为110​​0,等等。

圣牛,这必须像有史以来最糟糕的想法。

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

例如

十六进制的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来进行转换。

通过这种方式,您的转化将适用于任何数字限制最大限制。

答案 1 :(得分:1)

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

的整数

0100 1100

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

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

第二个操作是转移;一个人可以用>>向右或向左移动和<<

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

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

并执行此操作的次数与要转换的4位分组一样多。你得到的结果将是 反向顺序,即你得到的第一个十六进制数字在十六进制数的最右边。如果你想调整算法以返回前进数字,请随意!

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

答案 2 :(得分:1)

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

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

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

这应该让你对十六进制的内容有足够的了解 - >二进制转换。同样的想法!