44 votes

Quel est le but de "int mask = ~ 0;"?

J'ai vu la ligne suivante de code ici en C.

 int mask = ~0;

J'ai imprimé la valeur de mask en C et C++. Il permet d'imprimer -1.

Donc j'ai quelques questions:

  • Pourquoi attribuer une valeur ~0 pour le masque de variable?
  • Quel est le but de l' ~0?
  • Peut-on utiliser -1 au lieu de ~0?

81voto

Richard Hodges Points 1972

Il s'agit d'une méthode portable pour définir tous les bits binaires d'un entier sur 1 sans avoir à savoir combien de bits il contient dans l'architecture actuelle.

36voto

Lưu Vĩnh Phúc Points 3183

Le C et le C++ permettre à 3 différents entier signé formats: signe de grandeur, un complément et en complément à deux

~0 va produire un bits quel que soit le format , le système utilise. Il est donc plus portable que -1

Vous pouvez ajouter l' U suffixe (c - -1U) pour générer un tous un motif de bits de façon portable1. Toutefois ~0 indique l'intention plus claire: inverser tous les bits de la valeur 0 alors que -1 indique qu'une valeur de moins est nécessaire, non sa représentation binaire

1 parce que non signé opérations sont toujours réduits modulo le nombre qui est plus grand que la plus grande valeur qui peut être représenté par le type résultant

8voto

6502 Points 42700

Cela sur la plate-forme du complément à 2 (cela est supposé) vous donne -1, mais écrire directement -1 est interdit par les règles (entiers uniquement 0..255, unary ! , ~ et binaires & , ^ , | , + , << et >> sont permis).

5voto

chqrlie Points 17105

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).

2voto

skaak Points 49

Il y a bien longtemps, vous économisiez de la mémoire sur des équipements extrêmement limités tels que les ordinateurs 1K ZX 80 ou ZX 81. En BASIC, vous auriez

 Let X = NOT PI
 

plutôt que

 LET X = 0
 

Les nombres étant stockés sous forme de points flottants sur 4 octets, cette dernière utilise 2 octets de plus que la première alternative NOT PI, où NOT et PI occupent chacun un octet.

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