Преобразование списка bools в одну UINT - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть класс, который анализирует объект для отправки на другое аппаратное устройство. Класс содержит набор функций, которые либо включены, либо отключены (bools). Тем не менее, мы записываем слова в данные только на часть аппаратного обеспечения (по сути, uint или 16-разрядное целое число).

Поэтому мне нужно перевести

Feature1 (bool, true)
Feature2 (bool, false)
Feature3 (bool, false)
Feature4 (bool, false)
...
Feature16 (bool, false)

и разобрать его в одно слово:

000000000001

Устройство видит слово как little-endian, fyi.

Я пытался поразрядно - или против uint, но тот факт, что флаги являются bools, делает это грязным, поэтому мне было интересно, есть ли у кого-нибудь еще какие-нибудь хитрые предложения;)

РЕДАКТИРОВАТЬ : Не успел я опубликовать это, я расслабился и подумал об этом решении ...

private static ushort BooleanToUint(List<bool> bools)
        {
            ushort word = 0;
            for(int i = 0; i < bools.Count; i++)
            {
                if(bools[i])
                {
                    int twoToPower = (1 << i);
                    word = (ushort) (word + twoToPower);
                }
            }

            return word;
        }

Ответы [ 4 ]

1 голос
/ 21 апреля 2011

Если у вас есть логические значения в массиве, вы можете просто использовать их для индексации, чтобы установить соответствующий бит (если установлен):

bool[] boolValues = Enumerable.Repeat(true, 16).ToArray(); //test
uint intValue = 0;
for (int i = 0; i < boolValues.Length; i++)
{
    if (boolValues[i])
        intValue += (uint)(1 << i);
}
0 голосов
/ 21 апреля 2011

Вот ваше «ловкое» предложение:

создать метод расширения для типа «UInt16 []», который возвращает массив значений в «отдельное слово», например:

public static class UintArrayExtender
   {
      public static string ToWord(this UInt16[] array)
      {
         string val = string.Empty;
         if (array.Length > 0)
         {
            //works the array backwards
            for (int i = array.Length; i >= 0; i--)
            {
               val += array[i].ToString();

            }
         }
         return val;

      }

   }

теперь, везде, где вам нужно его использовать, вы можете вернуть массив UInt16 в одно слово, подобное этому:

      public string getTheWord()
      {
         UInt16[] myArray = new UInt16[15];
         myArray[0] = 0;
         myArray[1] = 0;
         myArray[2] = 0;
         myArray[3] = 0;
         myArray[4] = 0;
         myArray[5] = 0;
         myArray[6] = 0;
         myArray[7] = 0;
         myArray[8] = 0;
         myArray[9] = 0;
         myArray[10] = 0;
         myArray[11] = 0;
         myArray[12] = 0;
         myArray[13] = 0;
         myArray[14] = 0;
         myArray[15] = 1;

         return myArray.ToWord();

      }
   }
0 голосов
/ 21 апреля 2011

Я не совсем понял, что это за особенность, но может ли что-то подобное вам как-то помочь?

public static bool getFeature(int featureid) {
    return true; // or whatever
}

static void Main(string[] args)
{
    int bitmask = 0;
    for (int i = 0; i < 16; i++) {
        bitmask += getFeature(i) ? 1 << i : 0;
    }
}
0 голосов
/ 21 апреля 2011
bool[] items;

items[1] = true;
items[2] = true;
items[3] = true;
....

items[15] = true;

string s = null;

for(var i = 15; i <= 15; i--)
{
 s += Int.Parse(items[i].ToString()); 
}

return s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...