Inne niż mnożenie i bitshifting, można również użyć enum udokumentować związek. Zwykle nie warte wysiłku, ale tylko dla kompletności ...
enum Encoding
{
Flag3 = 1, NotFlag3 = 0,
Flag2 = 1 << 1, NotFlag2 = 0,
Flag1 = 1 << 2, NotFlag1 = 0
};
int val = (boolVal1 ? Flag1 : NotFlag1) |
(boolVal2 ? Flag2 : NotFlag2) |
(boolVal3 ? Flag3 : NotFlag3);
Po co byś się tym przejmował? Jest to trochę bardziej ogólne, więc możesz potencjalnie zmieniać wartości kodowania później bez dotykania potencjalnie rozproszonego kodu przy użyciu rzeczywistych wartości (na przykład, jeśli zdałeś sobie sprawę, że pominąłeś trochę w porównaniu do formatu jakiegoś pliku lub sieci dane, które musisz przeanalizować, możesz dodać je tylko w jednym miejscu i ponownie skompilować). Oczywiście lepiej jest po prostu zapewnić funkcję pojedynczego kodowania/dekodowania, a jeśli dodajesz nowe flagi, nadal będziesz tego potrzebować.
Chociaż flag1 i NotFlag1 mogą wydawać się bezsensowne, często ma się coś wspólnego z wykluczającymi się wzajemnie wartościami, jak np. Sticky and Floating lub Male and Female, i nie ma żadnego szczególnego powodu, aby zmuszać klientów do sprawdzenia, powiedzmy, Floating as ! Sticky lub Kobieta jako Mężczyzna etc ..
Po prostu fyi, czy "prawda prawdziwa prawdziwa" nie powinna być 7? W przeciwnym razie wszystkie formuły do tej pory są błędne ... – SinisterMJ
'int val = 4 * boolVal1 + 2 * boolVal2 + boolVal3;' da 7, gdy masz true true true, nie 8 –
Prawidłowo, właśnie napisałem źle. Thx za poprawianie! – tzippy