47 votes

(x | y) - y pourquoi ne pas être simplement x ou même `x | 0` ?

Je lisais le code d'un noyau, et à un endroit, j'ai vu une expression à l'intérieur de if comme

if (value == (SPINLOCK_SHARED | 1) - 1) {
         ............
}

SPINLOCK_SHARED = 0x80000000 est une constante prédéfinie.

Je me demande pourquoi nous avons besoin (SPINLOCK_SHARED | 1) - 1 - Le résultat de l'expression serait 80000000 - la même chose que 0x80000000, n'est-ce pas ? Mais pourquoi ORing 1 et Subtracting 1 ont-ils de l'importance ?

J'ai l'impression qu'il me manque quelque chose

0 votes

Il y a quelque chose qui n'est pas clair pour moi : est-ce que SPINLOCK_SHARED une variable ou une constante définie par #define ?

3 votes

define SPINLOCK_SHARED 0x80000000

1 votes

Je pense qu'il n'y a pas de raison. Il s'agit peut-être d'un problème de copier-coller. Pourriez-vous ajouter où vous avez trouvé cela exactement (quelle version de quel noyau, quel fichier, etc.).

0voto

funnydman Points 2947

Il semblerait que ce soit pour traiter plusieurs cas supplémentaires. Par exemple, dans ce cas, nous disons que SPINLOCK_SHARED ne peut être égal à 1 :

int SPINLOCK_SHARED = 0x01

int res = (SPINLOCK_SHARED | 1) - 1 // 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X