Побитовые операторы: проблема - PullRequest
2 голосов
/ 01 сентября 2011

У меня есть int-флаг, который будет выглядеть так:

  • 0 = невидимо, непрочитано
  • 1 = увидено
  • 2 = прочитано
  • 4 = ответил

Теперь у меня есть этот код:

if (flag & 4) //Beantwortet
{
    imageView.image = [UIImage imageNamed:@"beantwortet-40.png"];
}
else  if (flag & 2) //ungelesen
{
    imageView.image = [UIImage imageNamed:@"Flag1-40.png"]; 

}
else
{
       imageView.image = [UIImage imageNamed:@"neu-40.png"];
}

Что означает первый, если: ответ, второй, если: прочитал, последний, если: не прочитал.

Теперь пользователю можно ответить на почту, но установить флажок вручную как непрочитанный.Это означает, что значение int равно 5.

Как это проверить?

Я пробовал это:

    else if (flag & 4 && flag & 1) //Beantwortet, aber auf "Nicht gelesen" gesetzt
{
    imageView.image = [UIImage imageNamed:@"neu-40.png"];
}

Но я не только получаю 5 в этом, я получаю 7также.Как проверить на 5, а не на 7?

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Очевидным будет if((flag & 5) && !(flag & 2))

0 голосов
/ 01 сентября 2011

Почему бы просто не проверить, является ли значение int 5, как вы говорите?

else if (flag == 5) //Beantwortet, aber auf "Nicht gelesen" gesetzt
{
    imageView.image = [UIImage imageNamed:@"neu-40.png"];
}

Обновление : если у вас есть больше флагов, кроме первых четырех, вы можете предварительно-фильтруйте значение, а затем выполните проверку:

else if ((flag & 7) == 5) //Beantwortet, aber auf "Nicht gelesen" gesetzt
{
    imageView.image = [UIImage imageNamed:@"neu-40.png"];
}

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

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