Иногда бывают и такие задачи, мое решение под катом, возможно кто знает более простой способ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | switch (true) { case (0x7FFF > (int)(0x7FFF+1)): // 2^15-1 define( 'PHP_OS_BIT' , 16); break ; case (0x7FFFFFFF > (int)(0x7FFFFFFF+1)): // 2^31-1 define( 'PHP_OS_BIT' , 32); break ; case (0x7FFFFFFFFFFFFFFF > (int)(0x7FFFFFFFFFFFFFFF+1)): // 2^63-1 define( 'PHP_OS_BIT' , 64); break ; case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF > (int)(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+1)): // 2^127-1 define( 'PHP_OS_BIT' , 128); break ; default : define( 'PHP_OS_BIT' , 8); break ; } var_dump(PHP_OS); var_dump(PHP_OS_BIT); |
Можно использовать константу PHP_INT_MAX, но есть зависимость от версии PHP:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | switch (PHP_INT_MAX) { case (0x7FFF): // 2^15-1 define( 'PHP_OS_BIT' , 16); break ; case (0x7FFFFFFF): // 2^31-1 define( 'PHP_OS_BIT' , 32); break ; case (0x7FFFFFFFFFFFFFFF): // 2^63-1 define( 'PHP_OS_BIT' , 64); break ; case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF): // 2^127-1 define( 'PHP_OS_BIT' , 128); break ; default : define( 'PHP_OS_BIT' , 8); break ; } |
ну как бы да, но зачем?
У меня вот по работе случается так, что скрипты должны знать на какой архитектуре они работают. В зависимости от этого уже вычисления по разному происходят. Для 32 битных систем используется bcmath, а для 64 битных хватает стандартных функций.
А что бывает пхп на чем-то 8битном? Спектрум ? Денди ?
Just for fun
Только несколькими часами раньше столкнулся с разницей 32/64 в функции base_convert() при попытке преобразования 36-ой (0-9, a-z) в 10-ую (0-9). Спасибо.
Решение в лоб
Да. РНР на 8битной ОС это было бы круто))
Даешь РНР на Спектруме
Думаю сейчас мало таких динозавров, у которых установлена ранняя версия.
С помощью этой константы я бы проверял так:
$base
= log(PHP_INT_MAX*2+2, 2);
/* От максимального положительного значения до минимального (которое на 1 больше) и 0. Берем логарифм по основанию 2 и получаем количество бит в записи инта */
Но почему не легче сделать так?
$base
= PHP_INT_SIZE*8;
Т.е в существующих реалиях вполне хватит
define(
'PHP_OS_BIT'
, PHP_INT_MAX === 0x7FFFFFFF ? 32 : 64);
Если нужно универсальное решение которое будет работать без обновлений даже на РНР-9.3.1 1024-бит, то тут сам по себе подход надо менять, switch это не дело…
В прочем как уже сказали выше проще всего
define(
'PHP_OS_BIT'
, PHP_INT_SIZE << 3);
Ну а если сугубо посмеяться, я бы предложил так
$bits
= 1;
for
(
$i
= PHP_INT_MAX + 1;
$i
!= 1;
$i
/= 2 ) {
$bits
++;
};
define(
'PHP_OS_BIT'
,
$bits
);
Впрочем есть вариант и без констант…
for
(
$i
=1;
is_int
(pow(2,
$i
));
$i
++) {}
define(
'PHP_OS_BIT'
, ++
$i
);
(думаю сработает даже на РНР3, но под рукой нету)