iGuarDD
Ученик
Трям всем,с вами Яжка
Сегодня я солью свою библиотеку битовых операций
С её помощью можно хранить в 1 переменной до 32 различных значений,при том условии,что их суммарная максимальная битовая длина не превышает 32 (в силу некоторой специфики может быть и 64,и различные другие значения,но это — экзотика)
Я не буду описывать практическое применение этим функциям
И,кстати,эта библиотека не предназначена для новичков (если конечно Вы не видите способа применения этим функциям)
Кому нужно — увидят их пользу и способы применения)
К слову,эта библиотека является хорошей альтернативой "флагам" (на форуме есть тема по ним)
Разница лишь в удобстве и функционале
Итак,вот сами функции
Сегодня я солью свою библиотеку битовых операций
С её помощью можно хранить в 1 переменной до 32 различных значений,при том условии,что их суммарная максимальная битовая длина не превышает 32 (в силу некоторой специфики может быть и 64,и различные другие значения,но это — экзотика)
Я не буду описывать практическое применение этим функциям
И,кстати,эта библиотека не предназначена для новичков (если конечно Вы не видите способа применения этим функциям)
Кому нужно — увидят их пользу и способы применения)
К слову,эта библиотека является хорошей альтернативой "флагам" (на форуме есть тема по ним)
Разница лишь в удобстве и функционале
Итак,вот сами функции
PHP:
stock _getBitLen(var,&c = 1) // Возвращает битовую длину числа
{
// var — исходное число,длина которого будет возвращена
// c — не обязательный аргумент,в него будет записана сама длина
while(var >>>= 1) c++;
return c;
}
stock _getBit(const var,const bit) return (var >>> bit) & 0b1; // Возвращает значение указанного бита
// var — исходное число,из которого будет извлечено значение бита
// bit — номер извлекаемого бита
stock _getBits(const var,const pos,const len) return (var >>> pos) & ((0b1 << len) - 1); // Возвращает массив битов (в виде двоичного числа) из отрезка
// var — исходное число,из которого будет извлечён массив битов
// pos — начало отрезка
// end — длина отрезка
stock _setBit(&var,const bit,const set) return var = (var & (0xFFFFFFFF - (0b1 << bit))) | (set << bit); // Устанавливает значение указанного бита
// var — переменная,значение указанного бита которой будет изменено
// bit — номер изменяемого бита
// set — устанавливаемое значение (0 или 1)
stock _insBits(&var,const subvar,const pos,const len) return var = (var & 0xFFFFFFFF - (((0b1 << len) - 1) << pos)) | (subvar << pos); // Возвращает результат вставки в число массива битов
// var — переменная,в которую будет вставлен массив
// subvar — сам массив (в виде обычной целочисленной переменной)
// pos — начало отрезка
// len — количество извлекаемых битов из массива
stock _invBit(&var,const bit) return var ^= (0b1 << bit); // Инвертирует указанный бит
// var — переменная,значение указанного бита которой будет инвертировано
// bit — номер инвертируемого бита
stock _invBits(&var,const pos,const len) return var ^= (((0b1 << len) - 0b1) << pos); // Инвертирует биты из указанного отрезка
// var — переменная,отрезок битов которой будет инвертирован
// pos — начало отрезка
// len — длина отрезка
stock _clearBit(&var,const bit) return var &= (0xFFFFFFFF - (0b1 << bit));// Устанавливает значение 0 указанному биту (очищает его.Быстрее _setBit(var,bit,0))
// var — переменная,указанный бит которой будет очищен
// bit — номер очищаемого бита
stock _clearBits(&var,const pos,const len) return var &= var & 0xFFFFFFFF - (((0b1 << len) - 1) << pos); // Устанавливает значение 0 всем битам из указанного отрезка (очищает его.Быстрее _insBits(var,pos,len,0))
// var — переменная,отрезок битов которой будет очищен
// pos — начало отрезка
// len — длина отрезка
Последнее редактирование:
