Это один из распространенных способов сдвига битов. Есть несколько преимуществ:
1) Операции сдвига битов выполняются быстро.
2) Вы можете хранить несколько флагов в одном значении.
Если у вас есть приложение, которое имеет несколько функций, но вы хотите включить только некоторые (настраиваемые), вы можете сделать что-то вроде:
[Flags]
public enum Features
{
Profile = 1,
Messaging = 1 << 1,
Signing = 1 << 2,
Advanced = 1 << 3
}
И единственное значение для включения Messaging и Advanced будет:
(1 << 1) + (1 << 3) = 2 + 16 = 18
<add name="EnabledFeatures" value="18" />
А затем, чтобы выяснить, включена ли данная функция, вы просто выполняете простую побитовую математику:
var AdvancedEnabled =
EnabledFeatures & Features.Advanced == Features.Advanced;