web-dev-qa-db-fra.com

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

Je lisais un code du noyau, et à un endroit, j'ai vu une expression dans une instruction if comme

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

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

Je me demande pourquoi avons-nous besoin de (SPINLOCK_SHARED | 1) - 1 - à des fins de conversion de type? le résultat de l'expression serait 80000000-- identique à 0x80000000, n'est-ce pas? pourtant, pourquoi ORing 1 et Subtracting 1 sont importants?

J'ai l'impression que je manque pour obtenir quelque chose ..

47
RaGa__M

La plupart comme cela est fait pour gérer plusieurs cas supplémentaires. Par exemple, dans ce cas, nous disons que SPINLOCK_SHARED ne peut pas être 1:

int SPINLOCK_SHARED = 0x01

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