1

Тема: Аналог BitArray, але з елементами, що мають три значення

В мене є BitArray, деякі елементи котрого == true.
При перебиранні цих елементів, деякі з них використовують для побудови деяких штучок. Я хочу позначити ці бітики як використані.
Тобто, в моєму уявному BitArray є елементи, котрі можуть приймати три значення:
1. false
2. true
3. used

Яким способом краще це реалізувати, аби воно займало якомога менше місця в пам'яті, і аби до елементів масиву можна було б звертатись по індексу?

2 Востаннє редагувалося koala (17.06.2017 23:49:52)

Re: Аналог BitArray, але з елементами, що мають три значення

Варіант 1. Тримати 2 бітових масиви (чи в одному по 2 біти на тріт). На 32 біти - 16 трітів.
Варіант 2. Тримати масив цілих, які представляють набори трітів в троїчній системі  (0 - всі 0, 4 - дві останні цифри дорівнюють 1 і т.д. Максимальний ступінь 3, менший за 2^32 - 20, маємо 20 трітів на 32 біти, і трохи геморою з обчисленням.
Варіант 3. Довге число, що в 3-їчній системі представляє наш масив. На, скажімо, 2048 біт буде 1296 трітів - проти 1024 в першому варіанті і 1280 в другому. Зате обчислень набагато більше.

Подякували: 0xDADA11C7, FakiNyan, leofun013

3

Re: Аналог BitArray, але з елементами, що мають три значення

Ще можна використовувати "System.Nullable<bool>", або "bool?" (це те саме), тоді змінній можна присвоювати true, false, null. Але можуть виникнути незручності з оптимізацією в деяких задачах.

System.Nullable<bool> t;
t = null;  // ok
t = false; // ok
t = true;  // ok

if(!t.HasValue)            System.Console.WriteLine("t == null.");
if(t.HasValue && !t.Value) System.Console.WriteLine("t == false.");
if(t.HasValue && t.Value)  System.Console.WriteLine("t == true.");

if(t == null)  System.Console.WriteLine("t == null.");
if(t == false) System.Console.WriteLine("t == false.");
if(t == true)  System.Console.WriteLine("t == true.");

"System.Nullable<bool>" :
+1 читабельність коду,
+1 простота використання,
+1 підтримка коду,
-2 оптимізація.

4

Re: Аналог BitArray, але з елементами, що мають три значення

leofun01 написав:

"System.Nullable<bool>" :
+1 читабельність коду,
+1 простота використання,
+1 підтримка коду,
-2 оптимізація.

Третє значення мало бути "used", а не "null", так що читабельність 0.5. Простота - так, +1. Підтримка - залежить від реалізації; якщо акуратно з коментарями розписати клас масиву з int-ами, то з підтримкою проблем не буде. Ну а про оптимізацію одразу було сказано, що це пріоритет.

Подякували: leofun011

5

Re: Аналог BitArray, але з елементами, що мають три значення

ох, які ж ви корисні. зараз би повернутись в червень 2017 і повідомити мене про всі ці ваші повідомлення

Подякували: leofun011