2009-10-16 2 views
3

У меня возникла проблема, потому что у моей базы данных есть данные BIGINT (64-разрядные целые числа), но версия PHP, которую я запускаю, только 32-разрядная.Числовая строка (произвольный размер) -> Несколько целых чисел

Так что, когда я вытаскиваю значение из таблицы, я получаю числовую строку, представляющую 64-разрядное целое число в базе 10. Я бы идеально хотел использовать 64-битное целое в качестве битовой маски. Поэтому мне нужно перейти к двум 32-битным целым числам (один из них представляет собой верхнюю часть и одну нижнюю часть) или числовую строку в базе 2.

Проблема заключается в том, что я не могу просто умножить ее, потому что мой PHP только 32-бит. Я застрял?

ответ

6

Вы можете использовать MySQL bit shift operators, чтобы разбить 64-разрядное целое на два 32-разрядных целых числа. Таким образом, вы можете выбрать:

select (myBigIntField & 0xffffffff) as lowerHalf, 
     (myBigIntField >> 32) as upperHalf 
+0

ооо, это красиво. Почему я не подумал об этом? Примечание к себе: не отвечать на вопросы сразу после вставания. +1 – Joey

+0

Джеймс, это блестяще. Благодаря! К сожалению, я только что зарегистрировался, поэтому у меня нет репутации, чтобы проголосовать за ваш ответ, но это прекрасно. – Brad

1

Для обработки произвольных целых чисел размера, у вас есть два варианта в PHP: GMP и BC Math методы.

I trust GMP более эффективен с использованием некоторых пользовательских ресурсов, в то время как BC использует строки напрямую.

Если вы не будете обрабатывать слишком много (тысяч или более) чисел за раз, вы можете напрямую использовать BC.

1

У вас есть несколько вариантов здесь:

  1. Используйте либо BCMath или GMP, если они включены в вашей установке PHP. Оба должны обеспечивать целые числа произвольной длины.
  2. Задать базу данных для преобразования целого числа в длинной битовой строки в 64 символов вместо
  3. Написать реализацию bignum самостоятельно (больше работы :-))
Смежные вопросы