2010-10-28 66 views
1

Possible en double:
Check if a number is non zero using bitwise operators in C.Effectuer une logique pas! en utilisant uniquement des opérations au niveau du bit

Bonjour à tous,

Je travaille sur un projet et je besoin d'un peu d'aide avec une fonction. Nous devons écrire une fonction qui exécute la non logique, en utilisant uniquement les opérateurs suivants au niveau du bit:

~ &^| + << >> 

Je ne suis même pas sûr où commencer.

+0

Est-ce que ce devoir est? – GWW

+1

@GWW Soit cela, ou un développeur plomb très étrange. :) –

+0

Dans la description, j'ai déclaré que c'est un projet. :) – NotAround

Répondre

3

Si vous pouvez supposer que true = 1 et false = 0, cela pourrait faire l'affaire:

bool 
not(bool x) { 
    bool not_x = x^true; 
    return not_x; 
} 
2

Je pense que vous voulez commencer, vous aurez envie de clarifier la question. Il semble que vous manquiez à une fonction qui retournera 0 si l'un des bits d'un mot est "1", et quelque chose d'autre que 0 si tous les bits sont à zéro. En supposant un mot de 32 bits « un » vous pourriez faire quelque chose comme:

na1 = ~a; 
shifted_na1 = na1 >> 1; 
na2 = shifted_na1 & na1; /* any sequence of zeros is now 2 bits long */ 
shifted_na2 = na2 >> 2; 
na3 = shifted_na2 & na2; /* any sequence of zeros is now 4 bits long */ 
shifted_na3 = na3 >> 4; 
na4 = shifted_na3 & na3; /* any sequence of zeros is now 8 bits long */ 
shifted_na4 = na4 >> 8; 
na5 = shifted_na4 & na4; /* any sequence of zeros is now 16 bits long */ 
shifted_na5 = na5 >> 16; 
final = shifted_na5 & na5; /* any sequence of zeros is now 32 bits long */ 
really_final = final & 1; 
+0

logique! devrait retourner 1, pas 0xffffffff pour 0 argument. – blaze

+0

à droite, j'ai eu une autre erreur aussi. – mjhm

3

logique ne retourne 0, si la valeur est zéro, 1 sinon. En supposant int 32 bits:

int not_func(int v) { 
    /* compress value to single bit */ 
    int p = (v >> 16) | v; 
    p = (p >> 8) | p; 
    p = (p >> 4) | p; 
    p = (p >> 2) | p; 
    p = (p >> 1) | p; 

    p ^= 1; 
    return (p & 1); 
}