Если вы хотите проверить против один битовой маски, затем
if ((value & mask) == mask)
даст вам точное совпадение («все биты в маске»), и
if ((value & mask) != 0)
будет поставлять Свободное совпадение («любой бит в маске»). Компилятор дополнительно оптимизирует проверку против нуля.
Если у вас несколько битмаск, вы хотите извлечь максимальную информацию из каждой проверки во временной области (крайний случай: если все значения, которые вы получаете, равны , конечно, нечетные, вам не нужно проверять 0-й бит Это всегда будет 1). В идеале вам нужно идентифицировать первый раунд бит, который имеет 50% вероятность быть 1.
В обеих группах вы затем идентифицируете подгруппу (возможно, не то же самое в двух случаях) с такой же вероятностью.
if ((value & SPECIAL_MASK_1) == SPECIAL_MASK_1) {
if ((value & SPECIAL_MASK_2) == SPECIAL_MASK_2) {
...
} else {
...
}
} else {
if ((value & SPECIAL_MASK_3) == SPECIAL_MASK_3) {
...
} else {
...
}
}
Если у вас, скажем, 32 государства, каждый отображенные на один бит, и только один бит может быть установлен при каждом вызове - самый простой случай - «последовательный» последовательность была бы одна из 32 проверок, один за другая
if ((mask & 0x00000001) == 0x00000001) {
} else if ((mask & 0x00000002) == 0x00000002) {
}
...
и первая простая оптимизация должна была сначала установить проверки для наиболее часто встречающихся случаев. Скажем, что один случай из трех седьмой бит установлен; вы сначала ставите чек на седьмой бит.
Таким образом, вы получите только одну проверку на 33% времени; то, возможно, две проверки еще 20% времени, ..., а в конце в среднем вы можете запустить, скажем, семь чеков.
Другая возможность
if (mask & 0x0000FFFF) {
// The bit is in the LSW
if (mask & 0x0000FF00) {
// MSB of LSW
if (mask & 0x0000F000) {
...
} else {
}
}
} else {
}
Это будет работать каждый раз, точно пять проверок. Однако в этот момент соображения о архитектуре ЦП, прогнозировании ветвления и т. Д., Вероятно, превзойдут любую оптимизацию, которую вы могли бы попытаться сделать.
Если у вас нет сложной настройки очень или некоторые другие ограничения (например, встроенное устройство), я боюсь, что стоимость анализа, создания, отладки и поддержания «оптимизировано» против «грубой силы» проверки, скорее всего, более чем сбалансировать любое преимущество, которое вы могли бы выжать из первого.
Не могли бы вы пояснить, что такое вход и выход (в частности, что такое вход)? –
Если вы хотите иметь различное поведение для каждой маски, вам придется проверять каждый из них по отдельности. Если вы хотите узнать, подходит ли группа масок, вы можете | их. – Ari
Также '(битмаска и маска) == mask' немного избыточна. Если бит с маскировкой был истинным, он будет сжиматься до «true == true» – Ari