01.05.2010, 19:40
Давече понадобилось запихать в одну ячейку несколько разных переменных, настряпал вот эти функции, авось кому тоже пригодится:
bit_start - номер первого бита ячейки (отсчет ведется с младшего)
max_bits - размер пакуемого/вытаскиваемого значения в битах
первая пара функций для беззнаковых значений, вторая - для чисел со знаком
pawn Код:
stock upackcell(&cell, value, bit_start, max_bits)
{
new mask;
if (bit_start > 0)
{
mask = (cellmax << (bit_start + max_bits - 1) |
(cellmax >> (cellbits - bit_start)));
cell &= mask;
cell |= ~mask & (value << (bit_start));
}
else
{
mask = (cellmax << (max_bits - 1));
cell &= mask;
cell |= ~mask & value;
}
return value;
}
stock uunpackcell(cell, bit_start, max_bits)
{
if (bit_start > 0)
return ((cell & ~(cellmax << bit_start + max_bits - 1)) >> bit_start);
else
return (cell & ~(cellmax << bit_start + max_bits - 1));
}
stock spackcell(&cell, value, bit_start, max_bits)
{
return upackcell(cell, ~value, bit_start, max_bits);
}
stock sunpackcell(cell, bit_start, max_bits)
{
return ~uunpackcell(cell, bit_start, max_bits);
}
max_bits - размер пакуемого/вытаскиваемого значения в битах
первая пара функций для беззнаковых значений, вторая - для чисел со знаком