2016-08-27 5 views
0

У меня есть два битовых поля, один из 8 бит и один из 4 бит.Сопоставление битового поля с другим битовым полем в C#

[Flags] 
public enum Bits1 { 
    A = 1, 
    B = 2, 
    C = 4, 
    D = 8, 
    E = 16, 
    F = 32, 
    G = 64, 
    H = 128 
} 

[Flags] 
public enum Bits2 { 
    I = 1, 
    J = 2, 
    K = 4, 
    L = 8 
} 

мне нужно отобразить биты в Bits1 к Bits2, как это:

Bits2 = Map(Bits1) 

Например, если предположить, что карты А и С, карту на J, B карты ни к чему, и D, чтобы I в отображении ABCD (значение 13), после прохождения функции отображения, возвращает IJ (значение 3).

Карта должна быть установлена ​​и изменена программно по мере необходимости. Это звучит как нечто, что может сделать словарь, но я не уверен, как его настроить. Какой был бы лучший способ сделать это на C#?

+0

Возможно, я мог бы создать битмаску на основе сопоставления, которое я хочу использовать, а затем применить битовую маску к первому битовому полю? – GameKyuubi

ответ

1

Лучший способ это. Используйте массив, где вход является индекс в массиве, и вы вывести значение массива:

public Bits2 Map(Bits1 input) 
{ 
    return _mapping[(int) input]; 
} 

Вы должны затем определить 16 отображения следующим образом (это просто пример):

private static Bits2[] _mapping = new Bits2[16]() { 
    Bits2.I | Bits2.J, // this is index 0, so all Bits1 are off 
    Bits2.K,   // this is index 1, so all but A are off 
    Bits2.I | Bits2.L, // this is index 2, so all but B are off 
    Bits2.J | Bits2.K, // this is index 3, so all but A | B are off 
    // continue for all 16 combinations of Bits1... 
}; 

в примере показано, как кодировать первые 4 отображения:

none -> I | J 
A -> K 
B -> I | J 
A | B -> J | K 
0

Что вы имеете в виду

Карта должна быть установлена ​​и изменена программно по мере необходимости. Мне кажется, что отображение фиксируется определением перечислений. В вашем вопросе вы не укажете, как должен вести себя код, если в Bits2 отсутствуют некоторые флаги. На самом деле, Map функция может быть определена как это, если вам не нужно, чтобы обнаружить недостающие значения:

public Bits2 Map(Bits1 input) 
{ 
    return (Bits2)(int)input; 
} 

Конечно, если вам нужно определить отсутствующие значения, то вы можете посмотреть на Enum методы класса. ..

+0

Мне нужно иметь возможность добавлять отдельные сопоставления, а также очищать, получать и устанавливать целые сопоставления «на лету», поэтому я рассматривал словарь. – GameKyuubi

+0

Если у вас нет прямого сопоставления имен или значений, вам нужно написать какой-нибудь реальный код ... – Phil1970

Смежные вопросы