40 votes

Quand utiliser les opérateurs binaires lors du développement d'un site web ?

Bien que je comprenne le concept des opérateurs binaires, je ne peux pas dire que j'ai rencontré beaucoup de cas d'utilisation au cours du processus de développement web dans lesquels j'ai dû recourir aux opérateurs binaires.

  • Utilisez-vous des opérateurs binaires ?
  • Pourquoi les utilisez-vous ?
  • Quels sont les exemples de cas d'utilisation ?

N'oubliez pas que cette question est spécifiquement destinée à l'utilisation des opérateurs binaires dans les langages Web.

83voto

tyler Points 903

Je vais être plus explicite ici parce que je pense que les masques bitwise sont un outil formidable qui devrait être à la portée de tout développeur. Je vais essayer de développer les réponses ci-dessus. Tout d'abord, un exemple d'utilisation d'un entier pour maintenir des drapeaux d'état (usage courant) :

// These are my masks
private static final int MASK_DID_HOMEWORK  = 0x0001;
private static final int MASK_ATE_DINNER    = 0x0002;
private static final int MASK_SLEPT_WELL    = 0x0004; 

// This is my current state
private int m_nCurState;

A set mon état, j'utilise l'opérateur OR bitwise :

// Set state for'ate dinner' and 'slept well' to 'on'
m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL);

Remarquez comment je "ou" mon état actuel avec les états que je veux "allumer". Qui sait quel est mon état actuel et je ne veux pas le faire disparaître.

A non activé Dans mon état, j'utilise l'opérateur ET binaire avec l'opérateur de complément :

// Turn off the 'ate dinner' flag
m_nCurState = (m_nCurState & ~MASK_ATE_DINNER);

A vérifier mon état actuel, j'utilise l'opérateur AND :

// Check if I did my homework
if (0 != (m_nCurState & MASK_DID_HOMEWORK)) {
    // yep
} else { 
    // nope...
}

Pourquoi est-ce que je pense que c'est intéressant ? Disons que je conçois une interface qui définit mon état. Je pourrais écrire une méthode qui accepte trois booléens :

void setState( boolean bDidHomework, boolean bAteDinner, boolean bSleptWell);

Ou bien, je pourrais utiliser un seul nombre pour représenter les trois états et transmettre une seule valeur :

void setState( int nStateBits);

Si vous choisissez le deuxième modèle, vous serez très heureux lorsque vous déciderez d'ajouter un autre état - vous n'aurez pas à casser les impls existants de votre interface.

Mes deux centimes. Merci.

52voto

Jon Skeet Points 692016

L'utilisation principale que je fais des opérateurs binaires pourrait être pertinente n'importe où - représenter un ensemble de drapeaux. Par exemple, vous pourriez avoir un nombre entier dans la base de données représentant un ensemble d'autorisations de sécurité pour un utilisateur, et dans votre application Web, vous devriez les vérifier avant de continuer.

Ceux-ci ont tendance à ne nécessiter & y | - par exemple

if ((permissions & Permission.CreateUser) != 0)
{
    ...
}

ou

Permission requiredPermission = Permission.CreateUser
                                | Permission.ChangePassword;

Bit déplacement Selon mon expérience, les opérateurs sont moins utiles dans les applications "commerciales".

12voto

Pour les programmeurs Java, l'opérateur binaire xor (^) offre un moyen utile de coder un test OU exclusif entre deux booléens. Exemple :

boolean isFoo = ...
boolean isBar = ...

if (isFoo ^ isBar) {
    // Either isFoo is true or isBar is true, but not both.

Remarque : il n'y a pas de manipulation réelle de bits ici, mais c'est un moyen utile d'utiliser l'opérateur xor bitwise (dans le volet web ou ailleurs).

(La même chose peut s'appliquer à C#, puisqu'il est si similaire à Java. Je n'en suis pas sûr, cependant).

6voto

Robert Gould Points 29406

En dehors des drapeaux, il n'y a pas beaucoup de raisons d'utiliser les opérations sur les bits dans les langages de script. Mais une fois que vous vous enfoncez dans les niveaux inférieurs de votre pile, les opérations sur les bits deviennent de plus en plus critiques.

6voto

RestInPeace Points 65

La réponse à cette question a déjà été donnée, mais je voudrais partager mon expérience avec vous. & .

J'ai utilisé & il y a peu de temps pour valider un formulaire d'inscription lorsque je faisais un exercice ASP.NET C# où le court-circuitage && n'atteindrait pas l'effet désiré aussi facilement.

Ce que je voulais faire, c'était mettre en évidence tous les champs non valides du formulaire et afficher une étiquette de message d'erreur juste à côté de chaque champ non valide, et mettre en évidence tous les champs valides et supprimer les messages d'erreur de ceux-ci.

Le code que j'ai utilisé était quelque chose comme ceci :

protected void btnSubmitClicked(...) {
  username = txtUsername.Text;
  email = txtEmail.Text;
  pass = txtPassword.Text;
  if (isUsernameValid(username) & isEmailValid(email) & isPasswordValid(pass)) {
    // form is valid
  } else {
    // form is invalid
  }
  ...
}

private bool isPasswordValid(string password) {
  bool valid = true;
  string msg = "";
  if (password.length < MIN_PASSWORD_SIZE) {
    valid = false;
    msg = "Password must be at least " + MIN_PASSWORD_SIZE + " long.";
  }

  highlightField(txtPassword, lblPassword, valid, msg);
  return valid;
}

private void highlightField(WebControl field, Label label, string valid, string msg) {
  if (isValid) {
    // de-highlight
    field.BorderColor = VALID_FIELD_COLOR;
  } else {
    // highlight the text field and focus on it
    field.BorderColor = INVALID_FIELD_COLOR;
    field.Focus();
  }

  label.Text = msg;
}

// and other similar functions for username and email

Si je devais utiliser && au lieu de & l'instruction if dans btnSubmitClicked ne mettrait en évidence que le tout premier champ invalide, et tous les autres champs invalides après celui-ci ne seraient pas mis en évidence et son message d'erreur ne serait pas affiché parce que la méthode court-circuitée && cesserait de vérifier la condition après avoir rencontré un faux.

Il y a peut-être un meilleur moyen d'obtenir la même chose, mais j'ai trouvé & utile à ce moment-là.

Merci de votre lecture :)

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