web-dev-qa-db-fra.com

Comment vérifier si un entier est pair ou impair à l'aide d'opérateurs au niveau du bit

Comment vérifier si un entier est pair ou impair à l'aide d'opérateurs au niveau du bit

51
brisk man

En C (et la plupart des langages similaires à C)

if (number & 1) {
  // It's odd 
}
70
Jim Blackler

Considérez ce que "pair" et "impair" signifie en termes "bit". Les données d’entiers binaires étant stockées avec des bits indiquant des multiples de 2, le bit d’ordre le plus bas correspond à 2., ce qui est bien sûr 1, alors que tous les autres bits correspondront à des multiples de 2 (21 = 2, 22 = 4, etc.). Art ASCII gratuit:

NNNNNNNNN 
 |||||||| 
 ||||||| + −− bit 0, valeur = 1 (2) 
 |||||| + −−− bit 1, valeur = 2 (21) 
 ||||| + −−−− bit 2, valeur = 4 (22) 
 |||| + −−−−− bit 3, valeur = 8 (23) 
 ||| + −−−−−− bit 4, valeur = 16 (24) 
 || + −−−−−−−− bit 5, valeur = 32 (25) 
 | + −−−−−−−−− bit, valeur = 64 (26) 
 + −−−−−−−−−−− bit 7 (bit de poids fort), valeur = 128 (27) pour les numéros non signés, 
 valeur = -128 (-27) pour les numéros signés (complément de 2) 

Je n'ai montré que 8 bits ici, mais vous voyez l'idée.

Ainsi, vous pouvez savoir si un entier est pair ou impair en regardant uniquement le bit de poids faible: s'il est défini, le nombre est impair. Sinon, c'est même. Vous ne vous souciez pas des autres bits car ils désignent tous des multiples de 2 et ne peuvent donc pas rendre la valeur impaire.

La manière que vous examinez ce bit est à l'aide de l'opérateur AND de votre langue. En C et dans de nombreux autres langages dérivés syntaxiquement de B (oui, B), cet opérateur est &. En BASIC, c'est généralement And. Vous prenez votre entier, ET le avec 1 (qui est un nombre avec uniquement le bit de poids le plus faible), et si le résultat n'est pas égal à 0, le bit a été défini.

Je donne volontairement le code ici pas, non seulement parce que je ne sais pas quelle langue vous utilisez, mais parce que vous avez marqué la question "devoir". :-)

112
T.J. Crowder
if (number & 1)
    number is odd
else // (number & 1) == 0
    number is even

Par exemple, prenons le nombre entier 25, ce qui est impair . En binaire, 25 est 00011001. Notez que le bit le moins significatif b0 est 1.

00011001    
00000001   (00000001 is 1 in binary)
       &
--------
00000001
14
T M

Juste une note de bas de page à la réponse de Jim. 

En C #, contrairement à C, bitwise AND renvoie le nombre obtenu. Vous voudrez donc écrire:

if ((number & 1) == 1) {
   // It's odd
}
11
neontapir
if(x & 1)                               // '&' is a bit-wise AND operator
    printf("%d is ODD\n", x);
else
    printf("%d is EVEN\n", x);

Exemples:

    For 9:

      9 ->        1 0 0 1
      1 ->     &  0 0 0 1
      -------------------
      result->    0 0 0 1

Donc, 9 ET 1 nous donne 1, car le plus à droite de chaque nombre impair est 1.

     For 14:

       14 ->      1 1 1 0
       1  ->   &  0 0 0 1
       ------------------
       result->   0 0 0 0

Donc 14 AND 1 nous donne 0, le bit le plus à droite de chaque nombre pair étant 0.

5
Aditya Goel

Vous pouvez le faire simplement en utilisant l'opérateur binaire AND &

if(num & 1)
{
    //I am odd number.
}

Lisez plus ici - Vérification même impaire en utilisant l'opérateur bitwise en C

1
Pankaj Prakash
#include <iostream>
#include <algorithm>
#include <vector>

void BitConvert(int num, std::vector<int> &array){
    while (num > 0){
        array.Push_back(num % 2);
        num = num / 2;
    }
}

void CheckEven(int num){
    std::vector<int> array;
    BitConvert(num, array);
    if (array[0] == 0)
        std::cout << "Number is even";
    else
        std::cout << "Number is odd";
}

int main(){
    int num;
    std::cout << "Enter a number:";
    std::cin >> num;

    CheckEven(num);
    std::cout << std::endl;

    return 0;
}
0
Testing123

Également en Java, vous devrez utiliser if((number&1)==1){//then odd}, car dans les langages de type Java et C #, la variable int n'est pas convertie en boolean. Vous devrez utiliser les opérateurs relationnels pour renvoyer Une valeur boolean, à savoir true et false, à la différence des langages C et C++, qui traite les valeurs non nulles comme true.

0
therakum