Используя Побитовые операторы на флагах

Я не думаю, что это возможно, избегая как переменных времени выполнения, так и вспомогательной функции (надеясь, что кто-то может это опровергнуть).

И мне очень нравится ваше второе решение, но ... как насчет использования итераторов для y (если y поддерживает cbegin() и итераторы, очевидно).

Что-то как (осторожно: код не проверен)

template <std::size_t Ii...., std::size_t Xsize, std::size_t Ysize>
constexpr container<Xsize> insert(container<Xsize> x, container<Ysize> const & y) {
   auto it = y.cbegin();
   ((x[Ii] = *it++), ...);
   return x;
}

Это почти ваше первое решение, но доступ к y, увеличивающему итератор, должен быть (я полагаю, для последовательного обхода, для некоторых контейнеров) более эффективно (немного более эффективно), чем использование operator[]().

Но я также полагаю, что с хорошим оптимизатором заметной разницы нет.

26
задан Grace Note 6 July 2010 в 12:29
поделиться

6 ответов

Если Вы хотите, чтобы все биты в тестовой маске соответствовали:

if((value & mask) == mask) {...}

, Если Вы хотите, чтобы какой-либо единственный бит в тестовой маске соответствовал:

if((value & mask) != 0) {...}

различие является самым очевидным при тестировании значения на несколько вещей.

Для тестирования на исключение:

if ((value & mask) == 0) { }
43
ответ дан Marc Gravell 28 November 2019 в 06:10
поделиться

В первую очередь - используют перечисления с FlagAttribute. Это - то, для чего это.

[Flags]
public enum Time
{
    None = 0
    Current = 1,
    Past = 2,
    Future = 4
    All = 7
}

Тестирование затем сделано как это:

if ( (x & Time.Past) != 0 )

Или это:

if ( (x & Time.Past) == Time.Past )

последний будет работать лучше, если "Мимо" была комбинация флагов, и Вы хотели протестировать их всех.

Установка похожа на это:

x |= Time.Past;

Сбрасывание похоже на это:

x &= ~Time.Past;
29
ответ дан Vilx- 28 November 2019 в 06:10
поделиться

Можно также хотеть добавить дополнительный метод как это

  enum states {
     Current = 0x1,
     Past = 0x2,
     Future = 0x4,
     All = 0x7
  };

  static bool Is(this states current, states value) {
     return (current & value) == value;
  }

затем, можно сделать:

 if(state.Is(states.Past)) {
    // Past
 }
12
ответ дан Brian Rasmussen 28 November 2019 в 06:10
поделиться
if ((flags & PAST) == PAST)
{
  // PAST is there
}

if ((flags & CURRENT) != CURRENT)
{
  // CURRENT is not there
}
4
ответ дан mmcdole 28 November 2019 в 06:10
поделиться
(value & Current) == Current
0
ответ дан Samantha Branham 28 November 2019 в 06:10
поделиться

Вы могли использовать И на нем и проверить, совпадает ли результат с Вами и с?

-1
ответ дан Peter 28 November 2019 в 06:10
поделиться
Другие вопросы по тегам:

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