Вы можете упаковать данные в очень сжатом формате.
Наименьшая сумма, которую может адресовать компьютер x86, составляет байт, то есть 8 бит.
Если ваше приложение имеет 24 флага да/нет (bool), вы бы сохранили их по 1 байту каждый? Это 24 байта данных. Если вы используете биты, то каждый байт содержит 8 этих логических значений, поэтому вам нужно всего 3 байта для 24 значений да/нет:
> 1 Byte per flag:
> 0000 0000 = off
> 0000 0001 = on
> Easy to check: if(b == 0) { /* flag is off */ } else if(b == 1) { /* flag is on */ }
> 1 Bit per flag
> 0011 1101 = Flags 1, 4, 8, 16 and 32 are on, flags 2, 64 and 128 are off
> Packs 8 flags in 1 byte
> Harder to check:
> if( (b & 32) != 0) { /* Flag 32 is on */ }
Это важно для сетевых протоколов и других систем, где действительно важен каждый байт.
Для бизнес-приложений общего назначения обычно нет необходимости в дополнительной сложности, просто используйте 1 байт на флаг.
Это используется не только для логических значений. Например, некоторые приложения могут захотеть хранить два числа, а не от 0 до 15 — например, Commodore 64, которому действительно нужно было экономить оперативную память везде, где это возможно. Один байт может содержать два таких числа:
> Instead of interpreting this as 8 bits (ranging from 1 to 128)
> this is really two 4 bit numbers:
> 1001 0110
> First Number: 1001 = 1 + 8 = 9
> Second Number: 0110 = 2 + 4 = 6
>
> Getting the first number requires a bit shift to move them into position:
> (b >> 4) turns the above number into this:
> 0000 1001 - this can now be simply cast as a byte and returns 9
>
> The second number requires us to "turn off" the first 4 bits
> We use the AND operator for this: b = (b & 15)
> 15 in decimal is 0000 1111 in binary.
>
> 1001 0110 AND
> 0000 1111 =
> 0000 0110
>
> Once again, the result can be interpreted as a byte and results in the number 6
Еще один действительно изящный трюк — быстро проверить, является ли число четным или нечетным. Нечетное число всегда имеет младший значащий бит (1 бит), а четное число всегда ясно.
Итак, ваша проверка на наличие IsEven выглядит так:
return (b & 1) == 0; // Bit 1 not set - number is even
(Примечание: в зависимости от языка компиляторы МОГУТ решить оптимизировать материал, но в двух словах это все)
person
Michael Stum
schedule
24.03.2014