Vous êtes étudiant un codage défi avec un certain nombre de restrictions sur les opérateurs et la langue de constructions pour effectuer des tâches données.
Le premier problème est de retourner la valeur -1 sans l'utilisation de l' -
de l'opérateur.
Sur les machines qui représentent les nombres négatifs avec en complément à deux, la valeur -1
est représenté avec tous les bits définis à l' 1
, alors ~0
évalue -1
:
/*
* minusOne - return a value of -1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 2
* Rating: 1
*/
int minusOne(void) {
// ~0 = 111...111 = -1
return ~0;
}
D'autres problèmes dans le fichier ne sont pas toujours appliquées correctement. Le deuxième problème, en renvoyant une valeur booléenne représentant le fait la une int
de la valeur pourrait tenir dans une 16 bits signée short
a une faille:
/*
* fitsShort - return 1 if x can be represented as a
* 16-bit, two's complement integer.
* Examples: fitsShort(33000) = 0, fitsShort(-32768) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 8
* Rating: 1
*/
int fitsShort(int x) {
/*
* after left shift 16 and right shift 16, the left 16 of x is 00000..00 or 111...1111
* so after shift, if x remains the same, then it means that x can be represent as 16-bit
*/
return !(((x << 16) >> 16) ^ x);
}
Gauche transfert d'une valeur négative ou un nombre dont la valeur décalée est au-delà de la gamme de int
a un comportement indéfini, droit de transfert d'une valeur négative est mise en œuvre définies, de sorte que la solution ci-dessus est incorrect (même si elle est probablement la solution attendue).