Подбор суммируемых констант

79
01 марта 2022, 00:50

Необходимо сделать константы по сумме которых можно было бы определить что там лежит, как пример можно рассмотреть PHP JSON CONSTANT https://www.php.net/manual/ru/json.constants.php.

Описание: Нужно что-то вроде

1 - тип 1;
2 - тип 2;
3 - тип 3;
10 - возвращено на доработку;
20 - направлено на проверку;
100 - повторно;

Задача

Быстр вычислить из значения по какой-то формуле, что туда закодировано.

Прошу подсказать куда копать. может есть какие то готовое решения или формулы и правила формирования таких констант, желательно на PHP.

Answer 1

Обычным подходом является установка необходимых флагов в отдельных битах числа.

В вашем примере есть два вида флагов, условно говоря, тип (3 вида) и состояние (3 вида). Давайте устанавливать в младшие ⌈log2(3)⌉ = 2 бита информацию о типе и в следующие ⌈log2(3)⌉ = 2 бита информацию о состоянии. Определим следующие константы:

const TYPE1 = 0b00000000;
const TYPE2 = 0b00000001;
const TYPE3 = 0b00000010;
const STATE1 = 0b00000000;
const STATE2 = 0b00000100;
const STATE3 = 0b00001000;

Далее, для получения значения, кодирующего оба состояния, возьмём битовую сумму констант каждого вида:

$result = TYPE2 | STATE3;  // 0b00001001

Теперь, чтобы обратно узнать, какие флаги были выставлены, битово умножим получившееся значение на необходимую маску:

switch ($result & 0b00001100) {
    case STATE1:
        //
        break;
    case STATE2:
        //
        break;
    case STATE3:
        //
        break;
    default:
        echo 'error value';
}

http://sandbox.onlinephpfunctions.com/code/2024a763d84c6d8bd324545e78bd27d1eeddd869

Заметьте, что 8-битные числа были использованы для примера. В реальных программах можно использовать 32-битные или 64-битные числа в зависимости от системы.

В PHP 7.4, кстати, реализовано разделение цифр числа подчёркиванием. Так что можно написать:

const TYPE1 = 0b0000_00_00;
const TYPE2 = 0b0000_00_01;
const TYPE3 = 0b0000_00_10;
const STATE1 = 0b0000_00_00;
const STATE2 = 0b0000_01_00;
const STATE3 = 0b0000_10_00;
READ ALSO
Ошибки при работе с google/cloud-vision PHP - Fail to push limit

Ошибки при работе с google/cloud-vision PHP - Fail to push limit

Установил google/cloud-vision через композер Устанавливаю переменную окружения с путем до файла с ключем, выполняю код из примера:

306
Регулярное выражение на проверку длины

Регулярное выражение на проверку длины

Есть следующая регулярка которая проверяет номер телефона /373(\d{9})$/

105
Робокасса не заносит данные в БД

Робокасса не заносит данные в БД

Оплата проходит, но номер почему-то не меняетсяВ БД есть колонка с полем ordernum, там я планировал делать номер заказа +1 каждый раз

108
Как правильно скачивать файлы с удаленного сервера?

Как правильно скачивать файлы с удаленного сервера?

Как правильно скачивать статические файлы с удаленного сервера? 1 запуск скрипта = 1 скачивание файла, те keep-alive не рассматривается

86