在不使用函数的情况下,在PHP中将十六进制数转换为十进制数,八进制数转换为十进制数

时间:2015-04-04 11:17:54

标签: php hex octal

所以,我的一位同事向我提出了这个PHP问题。

以下代码的输出是什么?

<php
     echo 0x33, ' birds sit on ', 022, ' trees.';
?>

上面的脚本评估为51 birds sit on 18 trees.我知道,0x33表示十六进制数,022表示八进制数。

可以通过运行此脚本来回答这个问题。无论如何将十六进制数(基数16)和八进制数(基数8)转换为十进制数(基数10)而不使用像hexdec()和octdec()这样的函数?


答案:

由于这个问题已经结束,我无法回答这个问题。如果面试官在面试中询问同一个问题或说服面试官使用某些PHP函数来得到答案,你不能简单地拒绝回答。

假设,如果你想找出4的2的幂,那么PHP中的函数就像pow(4, 2)一样。但是开发人员应该有一个想法来评估这些基本问题。

这些问题毫无价值,在现实世界中并不实用,但在采访和考试方面,它们值得讨论。

够了。以下是答案:(感谢Google)

将十六进制数转换为十进制数:

+-----------------+------------------+
|   Hexadecimal   |     Decimal      |
+------------------------------------+
|       0         |        0         |
|       1         |        1         |
|       2         |        2         |
|       3         |        3         |
|       4         |        4         |
|       5         |        5         |
|       6         |        6         |
|       7         |        7         |
|       8         |        8         |
|       9         |        9         |
|       A         |        10        |
|       B         |        11        |
|       C         |        12        |
|       D         |        13        |
|       E         |        14        |
|       F         |        15        |
+-----------------+------------------+

示例1:

十六进制数是0x33,(开头忽略0x)

  1. 从上表中获取十六进制数的十进制等值。 3等于3,所以33等于33。
  2. 由于十六进制是基数为16的数字,因此将每位数乘以16位数的位数。 (数字位置为0,从0开始,从右到左)
  3. 0x33 =(3 * 16 1 )+(3 * 16 0
  4. 0x33 = 48 + 3
  5. 0x33 = 51
  6. 示例2:

    十六进制数是0xA,(开头忽略0x)

    1. 从上表中获取十六进制数的十进制等值。 A等于10.
    2. 由于十六进制是基数为16的数字,因此将每个数字乘以16位数的位数。
    3. 0xA =(10 * 16 0
    4. 0xA = 10 * 1
    5. 0xA = 10
    6. 将八进制数转换为十进制数:

      +-----------------+------------------+
      |     Octal       |     Decimal      |
      +------------------------------------+
      |       0         |        0         |
      |       1         |        1         |
      |       2         |        2         |
      |       3         |        3         |
      |       4         |        4         |
      |       5         |        5         |
      |       6         |        6         |
      |       7         |        7         |
      |       10        |        8         |
      |       11        |        9         |
      |       12        |        10        |
      |       13        |        11        |
      |       14        |        12        |
      |       15        |        13        |
      |       16        |        14        |
      |       17        |        15        |
      |       20        |        16        |
      +-----------------+------------------+
      

      示例1:

      八进制数为022

      1. 从上表中获取八进制数的十进制等值。 022等于022。
      2. 由于八进制是一个基数为8的数字,所以将每个数字乘以8位数的位数。 (数字位置为0,从0开始,从右到左)
      3. 022 =(0 * 8 2 )+(2 * 8 1 )+(2 * 8 0
      4. 022 = 0 + 16 + 2
      5. 022 = 18
      6. 示例2:

        八进制数为010

        1. 从上表中获取八进制数的十进制等值。 010等于010。
        2. 由于八进制是一个基数为8的数字,因此将每个数字乘以8位数的位数。
        3. 010 =(0 * 8 2 )+(1 * 8 1 )+(0 * 8 0
        4. 010 = 0 + 8 + 0
        5. 010 = 8
        6. 在我们的案例中:

          <php
               echo 0x33, ' birds sit on ', 022, ' trees.'; // outputs, 51 birds sit on 18 trees.
          ?>
          

          希望这有助于其他正在寻找这个问题答案的PHP开发人员。

1 个答案:

答案 0 :(得分:2)

对于数字 n i n i-1 ... n 1 n 0 (即1234将具有n 3 = 1,n 2 = 2,n 1 = 3,n 0 = 4)在基数 x 中,您可以将其十进制值计算为:

Sum j = 0 to i n j x j

因此,如果1234在基数16,我们将有4·16 0 + 3·16 1 +2⋅16 2 +1⋅16 3 = 4660。

这实际上就是数字系统的工作。另请注意,从10到10的基本转换等于标识函数。

http://en.wikipedia.org/wiki/Positional_notation#Base_conversion