Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- // 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)
- #define FLAG1 1 // Definamos como a primeira flag um número ser divisível por 2
- #define FLAG2 2 // Divisível por 3
- #define FLAG3 4 // Aqui teremos se o número é primo
- /* 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:
- http://www.cplusplus.com/doc/tutorial/preprocessor/
- */
- using namespace std;
- bool ehprimo(int n) // Uma função bem 'grossa' para saber se um número é primo, embora haja métodos melhores
- {
- for(int a = 2; a < n; ++a)
- {
- if (n%a == 0)
- {
- return false;
- }
- }
- return true;
- }
- int main(int argc, char **argv)
- {
- int a;
- short flag = 0; // Criemos a flag como uma short inicialmente zerada, já que não temos flags ativas.
- cout << "Digite um número inteiro: ";
- cin >> a;
- if(a%2 == 0 && a >=2) // Condição para nossa flag1
- {
- flag += FLAG1;
- }
- if(a%3 == 0 && a >=3) // Condição para nossa flag2
- {
- flag += FLAG2;
- }
- if(ehprimo(a)) // Condição para nossa flag3
- {
- flag += FLAG3;
- }
- // Agora vamos verificar se o número possui a primeira flag, há duas maneiras, a primeira será por operadores lógicos binários:
- if(flag&FLAG1)
- {
- cout << "FLAG1 está ativa!" << endl;
- }
- if(flag&FLAG2)
- {
- cout << "FLAG2 está ativa!" << endl;
- }
- if(flag&FLAG3)
- {
- cout << "FLAG3 está ativa!" << endl;
- }
- // Agora com os operadores shift e left, como fazer?
- // Para a primeira flag, note que foi somado 1, logo o número será ímpar (única maneira de um número ser ímpar), logo:
- if(flag%2 == 1)
- {
- cout << "FLAG1 está ativa!" << endl;
- }
- 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.
- {
- cout << "FLAG2 está ativa!" << endl;
- }
- 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.
- {
- cout << "FLAG3 está ativa!" << endl;
- }
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement