【问题标题】:PHP: Big integer base 10 represented as string to binary stringPHP:以 10 为底的大整数表示为字符串到二进制字符串
【发布时间】:2014-07-26 14:28:27
【问题描述】:

我需要将一个表示为字符串的非常大的整数转换为二进制字符串(也称为普通整数,但它总是比普通 php 整数可以容纳的更大)以有效地将其存储在数据库中并具有唯一索引它。

这个数字来自 GMP (gmp_strval()) 并且可能有不同的长度,通常在其中大约 200-300 个“字符”,所以它永远不适合 PHP 整数。这个想法是将其转换为表示整数的二进制字符串,一种大整数。我可以用 PHP 做吗?

【问题讨论】:

    标签: php string integer bigint


    【解决方案1】:

    找到可以做到的 Math_BigInteger 库:

    $a = new Math_BigInteger($intString);
    $base256IntString = $a->toBytes();
    

    https://github.com/pear/Math_BigInteger

    【讨论】:

      【解决方案2】:

      当然可以。 记住如何手动将十进制数转换为二进制数。

      1. 查看最后一位数字是偶数(给出 0)还是奇数(给出 1)
      2. 如果得到 1,则减去 1。
      3. 除以 2。这必须像小学一样逐个数字地完成 :-)
      4. 重复此操作,直到您的十进制数变为零。

      我为此写了一个函数

      function strMod2(array $dec)
      {
          return ((int)end($dec)) % 2;
      }
      
      function strDivBy2(array $dec)
      {
          $res = [];
          $carry = 0;
      
          if($dec[0] == '0')
              array_shift($dec);
      
          $len = count($dec);
          for($i = 0; $i < $len; $i++)
          {
              $num = $carry*10 + ((int)$dec[$i]);
              $carry = $num % 2;
              $num -= $carry;
              $res[] = $num / 2;
          }
      
          return $res;
      }
      
      
      function dec2bin_str($dec)
      {
          $dec_arr = str_split($dec);
          $bin_arr = [];
          while(count($dec_arr) > 1 || $dec_arr[0] != 0)
          {
              array_unshift($bin_arr, strMod2($dec_arr));
              $dec_arr = strDivBy2($dec_arr);
          }
      
          return implode($bin_arr);
      }
      

      你可以把它当作

      echo dec2bin_str('5');     // '101'
      echo dec2bin_str('146456131894613465451');        // '1111111000001111100101101000000000000010100001100010101100101101011'
      

      也许这可以通过使用大整数库来更快地完成。

      【讨论】:

      • 感谢您的回答!但是我找到了可以做到这一点的小库,我将在此处发布它的链接。
      猜你喜欢
      • 2023-03-29
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2013-08-24
      • 1970-01-01
      相关资源
      最近更新 更多