PHP: приведение к длинному или беззнаковому целому числу с 32 битами - PullRequest
1 голос
/ 19 января 2011

У меня есть таблица PostgreSQL 8.4.6, в которой руки игрока, содержащие до 32 карт, представлены 32 битами:

 # \d pref_hand
               Table "public.pref_hand"
 Column |            Type             |   Modifiers
--------+-----------------------------+---------------
 id     | character varying(32)       |
 hand   | bigint                      | not null
 money  | integer                     | not null
 stamp  | timestamp without time zone | default now()
Check constraints:
    "pref_hand_hand_check" CHECK (hand > 0)

(вы можете видеть, что я уже обманул выше, используя bigint ).

Мой сценарий (пожалуйста, прокрутите вниз, чтобы увидеть отрендеренные карты), работает нормально на 64-битном CentOS 5.5 Linux. Но когда я копирую его на свою 32-разрядную виртуальную машину разработки, он не работает.

Вот выдержка из кода:

$sth = $db->prepare('select hand, money
                     from pref_hand where id=?
                     order by stamp desc');
$sth->execute(array($id));
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        print ('<div>');
        for ($i = count($CARDS) - 1; $i >= 0; $i--) {
                $card  = $CARDS[$i];
                $color = (strpos($card, '♥') > 0 ||
                          strpos($card, '♦') > 0 ? 'red' : 'black');

                if (23 == $i || 15 == $i || 7 == $i)
                        print('&nbsp;');

                if ((1 << $i) & $row['hand'])
                        printf('<span class="%s">%s</span>', $color, $CARDS[$i]);
        }
        print ('</div>');
   }

и я думаю, что if ((1 << $ i) & $ row ['hand']) </strong> терпит неудачу там (извините, я подготовлю сокращенный тестовый случай позже, если я не ' не получил ответ ...)

Мой вопрос: как лучше всего справиться с этими ситуациями в PHP? Мне нужно как-нибудь привести $ row ['hand'] к unsigned int или long , чтобы битовый оператор AND снова работал, но я могу ' найти эти типы данных в PHP документах.

Спасибо! Alex

1 Ответ

0 голосов
/ 19 января 2011

Вы можете использовать GMP для сохранения номера, а затем проверить, доступна ли карта через gmp_testbit. Хотя это, очевидно, требует установки GMP (и обычно это не на виртуальном хостинге).

...