String numérica (tamanho arbitrário) -> múltiplos números inteiros
Pergunta
Estou enfrentando um problema porque meu banco de dados tem dados BIGINT (números inteiros de 64 bits), mas a versão do PHP que estou executando é de apenas 32 bits.
Então, quando retiro o valor de uma tabela, acabo com uma sequência numérica representando um número inteiro de 64 bits na base 10. O que eu gostaria de fazer é usar o número inteiro de 64 bits como uma máscara de bits. Então, eu preciso ir para dois números inteiros de 32 bits (um representando a parte superior e outro na parte inferior) ou uma corda numérica na base 2.
O problema é que não posso simplesmente multipli-lo porque meu PHP é de apenas 32 bits. Estou preso?
Solução
Você pode usar o mysql operadores de mudança de bits dividir o número inteiro de 64 bits em dois números inteiros de 32 bits. Então, você pode selecionar:
select (myBigIntField & 0xffffffff) as lowerHalf,
(myBigIntField >> 32) as upperHalf
Outras dicas
Para lidar com números inteiros de tamanho arbitrário, você tem duas opções no PHP: GMP e BC Math métodos.
EU acreditam O GMP é mais eficiente usando alguns recursos personalizados, enquanto o BC usa strings diretamente.
Se você não estiver processando muitos (milhares ou mais) de números por vez, poderá usar o BC diretamente.
Você tem algumas opções aqui:
- Use qualquer um Bcmath ou GMP Se eles estiverem incluídos na sua instalação PHP. Ambos devem fornecer números inteiros de comprimento arbitrário.
- Peça ao banco de dados para converter o número inteiro em uma string de bit de longa duração de 64 caracteres
- Escreva uma implementação de Bignum (mais trabalho :-))