Delphi. Битовые операции и фильтр Блума. Вступление.

Часто встречается множество булевых параметров, которые нужно хранить в базе. Что-то существует или не существует. Что-то true или false. И когда таких параметров несколько десятков – сложно воспринимать базу. Для этого, как я понял, существуют битовые операции и фильтр Блума. Суть в том, что мы храним данные в виде, скажем 00100000, где 5-й выставленный бит отвечает за что-то в логике программы, ну, скажем, за то, адаптивный это тест или нет. Таким образом, можно вместо 8 полей в базе прийти к 1 полю, которое будет содержать в себе 8 boolean полей. Этакая экономия сил, минус которой – потеря читабельности. Если проект огромный, то, конечно, это нормальный ход. Но где-то нужно хранить расшифровку, ключ того, какой бит отвечает за тот или иной параметр.

Что делаем дальше?

Элементарные битовые операции

Освежим в памяти работу с битовыми операциями, написав небольшую программку. Как известно, над byte, shortint, word, integer, longint возможны побитовые операции. Для простоты, будем работать с 8 битами, то есть с байтом. Как в Delphi узнать сколько байтов и битов занимает переменная?

SizeOf(byte) =1, это 8 бит.

SizeOf(integer) =4, это 4*8 бит=32 бита.

На калькуляторе программиста будем видеть, соответственно для 32 разрядов, например…

64

Будем выставлять 5 бит, снимать его, переключать и др.

63

Итак, пусть у нас есть переменная типа Byte. В ней содержится 8 бит как мы знаем из школы)

Как выставить и снять бит (через степени двойки)?

Как выставить и снять бит через shl?

Как переключить бит? Если был выставлен – то снять, если был снят, то выставить?

Как проверить несколько битов?

Как перевести Byte в “нормальные биты”, то есть, например  в 00100000 ?

А теперь все вместе…

Код, программы, иллюстрирующий элементарные битовые операции

В принципе, это уже можно хранить в базе как varchar скажем в mySQL, но в MySQL, да и в любой другой базе есть свои возможности для работы с битовыми операциями. В одном из след. постов продолжу эту тему, а также постараюсь раскрыть работу с фильтром Блума. Этот пост получился как замануха))) Но по сути это было вступление.

This entry was posted in Delphi. Bookmark the permalink.

6 Responses to Delphi. Битовые операции и фильтр Блума. Вступление.

  1. Дмитрий Кудрявцев says:

    Ваш код очистки бита:
    a:=( a and (0 shl 5) ); // Сняли
    не будет работать в таком виде, нужно
    a := a and not(1 shl 5);

  2. lmikle says:

    Если не ошибаюсь, то
    a:=( a and (0 shl 5) ); // Сняли
    снимет ВСЕ биты, ибо как 0 не двигай, всегда в результате будет 0.
    Надо как-то так:
    a:=( a and (not (0 shl 5) )); // Сняли

  3. Алексей says:

    Вот тут неправда:
    a:=( a and (0 shl 5) ); // Сняли
    Не снимается, а сбрасывается в 0 вся переменная/

  4. Константин says:

    a:=( a and (0 shl 5) ); // Сняли
    Это сильно! А также сняли и все остальные биты…
    PS: Тесты правильно надо писать 😉

  5. Stanislav_Panteleev says:

    Ребята, всем спасибо, ошибку поправил, теперь норм!

Leave a Reply