Advertisement
Viniciusd

Operadores binários para testagem de flags

Jun 1st, 2013
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. // Já que os operadores bit-a-bit funcionário a nível binário (valores 0 ou 1), nossas flags serão potências de 2, para que sejam representadas perfeitamente de maneira binária (qualquer coisa, revisa a conversão de números decimais para binários)
  4.  
  5. #define FLAG1 1 // Definamos como a primeira flag um número ser divisível por 2
  6. #define FLAG2 2 // Divisível por 3
  7. #define FLAG3 4 // Aqui teremos se o número é primo
  8.  
  9. /* Utilizei as macros para definir as flags, seriam o equivalente a utilizar const ints, só que não ocupam espaço na memória, são pré-processadas, caso queiras mais informações a respeito, ler:
  10. http://www.cplusplus.com/doc/tutorial/preprocessor/
  11. */
  12.  
  13. using namespace std;
  14.  
  15. bool ehprimo(int n) // Uma função bem 'grossa' para saber se um número é primo, embora haja métodos melhores
  16. {
  17.     for(int a = 2; a < n; ++a)
  18.     {
  19.         if (n%a == 0)
  20.         {
  21.             return false;
  22.         }
  23.     }
  24.     return true;
  25. }
  26.  
  27. int main(int argc, char **argv)
  28. {
  29.     int a;
  30.     short flag = 0; // Criemos a flag como uma short inicialmente zerada, já que não temos flags ativas.
  31.     cout << "Digite um número inteiro: ";
  32.     cin >> a;
  33.     if(a%2 == 0 && a >=2) // Condição para nossa flag1
  34.     {
  35.         flag += FLAG1;
  36.     }
  37.     if(a%3 == 0 && a >=3) // Condição para nossa flag2
  38.     {
  39.         flag += FLAG2;
  40.     }
  41.     if(ehprimo(a)) // Condição para nossa flag3
  42.     {
  43.         flag += FLAG3;
  44.     }
  45.     // Agora vamos verificar se o número possui a primeira flag, há duas maneiras, a primeira será por operadores lógicos binários:
  46.     if(flag&FLAG1)
  47.     {
  48.         cout << "FLAG1 está ativa!" << endl;
  49.     }
  50.     if(flag&FLAG2)
  51.     {
  52.         cout << "FLAG2 está ativa!" << endl;
  53.     }
  54.     if(flag&FLAG3)
  55.     {
  56.         cout << "FLAG3 está ativa!" << endl;
  57.     }
  58.     // Agora com os operadores shift e left, como fazer?
  59.     // Para a primeira flag, note que foi somado 1, logo o número será ímpar (única maneira de um número ser ímpar), logo:
  60.     if(flag%2 == 1)
  61.     {
  62.         cout << "FLAG1 está ativa!" << endl;
  63.     }
  64.     if((flag>>1)%2 == 1) // Movendo os bits uma casa para a direita faremos com que o bit referente à primeira flag 'suma' e o da segunda vá para o lugar do primeiro, agora há o mesmo raciocínio, se essa flag estiver ativa, o número será ímpar.
  65.     {
  66.         cout << "FLAG2 está ativa!" << endl;
  67.     }
  68.     if((flag>>2)%2 == 1) // Mesmo raciocínio, só que agora para a terceira flag, note que para testar a n-ésima flag, movemos n-1 bits.
  69.     {
  70.         cout << "FLAG3 está ativa!" << endl;
  71.     }
  72.     return(0);
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement