Подсчет количества флагов установлен на перечислении

Вы можете просто сделать:

data(mtcars) #get some preinstalled data


model <- lm(mpg ~ ., data = mtcars) #fit the model

summary(model) #get the summary

Это делает линейную регрессию mpg по отношению ко всем другим переменным. Дальнейшая обработка не требуется.

19
задан Michael Meadows 24 March 2009 в 12:59
поделиться

7 ответов

После наблюдения сайта Assaf предположил, что мне удалось найти немного отличающееся решение, что я получил работу для Int32.

Вот код для кого-либо еще:

    internal static UInt32 Count(this Skills skills)
    {
        UInt32 v = (UInt32)skills;
        v = v - ((v >> 1) & 0x55555555); // reuse input as temporary
        v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp
        UInt32 c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count
        return c;
    }
7
ответ дан 30 November 2019 в 03:29
поделиться

Количество эквивалентно подсчету, сколько битов установлено на 1 в целочисленном значении перечисления.

Существуют очень быстрые способы сделать это в C/C++, который можно адаптировать к C#:

например.

int bitcount(unsigned int n) {
   /* works for 32-bit numbers only    */
   /* fix last line for 64-bit numbers */

   register unsigned int tmp;

   tmp = n - ((n >> 1) & 033333333333)
           - ((n >> 2) & 011111111111);
   return ((tmp + (tmp >> 3)) & 030707070707) % 63;
}

Взятый отсюда.

Править
Если ссылка является битой. Найденный другим, который, вероятно, содержит то же содержание.

3
ответ дан 30 November 2019 в 03:29
поделиться
<FlagsAttribute()> _
Public Enum Skills As Byte
    None = 0
    Skill1 = 1
    Skill2 = 2
    Skill3 = 4
    Skill4 = 8
    Skill5 = 16
    Skill6 = 32
    Skill7 = 64
    Skill8 = 128
End Enum


    Dim x As Byte = Skills.Skill4 Or Skills.Skill8 Or Skills.Skill6
    Dim count As Integer
    If x = Skills.None Then count = 0 Else _
        count = CType(x, Skills).ToString().Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries).Count

зависит от определения "лучше".

проверка на Навыки. Ни один не требуется, потому что, если никакие биты не идут, строка () возвращает Навыки. Ни один, что приводит к количеству 1. это работало бы то же на целое число, долго, и их неподписанные родственники.

0
ответ дан 30 November 2019 в 03:29
поделиться

единственная причина использовать этот метод состоит в том, если флаги не непрерывны и если флаги будут периодически добавляться.

<FlagsAttribute()> _
Public Enum Skills As Integer
    Skill1 = CInt(2 ^ 0) 'bit 0
    Skill2 = CInt(2 ^ 1)
    Skill3 = CInt(2 ^ 2)
    Skill4 = CInt(2 ^ 3)
    Skill5 = CInt(2 ^ 4)
    Skill6 = CInt(2 ^ 5)
    Skill7 = CInt(2 ^ 6)
    Skill8 = CInt(2 ^ 7)
    Skillx = CInt(2 ^ 10) 'bit 10, some bits were skipped
End Enum


    Dim mySkills As Integer = Skills.Skillx Or Skills.Skill4 Or Skills.Skill8 Or Skills.Skill6
    Dim count As Integer 'count of bits on
    count = CType(mySkills, Skills).ToString().Split(New Char() {","c}, _
                                                     StringSplitOptions.RemoveEmptyEntries).Count

если "лучше" означает быстрее, что это не ;) это.

0
ответ дан 30 November 2019 в 03:29
поделиться
int count = Enum.GetValues(typeof(Skills)).Length;
-2
ответ дан 30 November 2019 в 03:29
поделиться

Перечисление. GetNames () возвратит массив всех имен в перечислении, добавить.Length для нахождения количества.

-3
ответ дан 30 November 2019 в 03:29
поделиться

Следующий код даст вам количество битов, установленных для заданного числа любого типа, размер которого варьируется от байта до длинного.

public static int GetSetBitCount(long lValue)
{
  int iCount = 0;

  //Loop the value while there are still bits
  while (lValue != 0)
  {
    //Remove the end bit
    lValue = lValue & (lValue - 1);

    //Increment the count
    iCount++;
  }

  //Return the count
  return iCount;
}

Этот код очень эффективен, поскольку он только повторяется один раз для каждого бита, а не один раз для каждого возможного бита, как в других примерах.

28
ответ дан 30 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: