Qu'est-ce une esperluette dans l'évaluation arithmétique et des nombres avec des x signifie en Bash?

voix
3

Je suis curieux de savoir ce que fait exactement la comparaison suivante, avec autant de détails que possible, en particulier concernant la 0x2et les &personnages et ce qu'ils font exactement,

if [ $((${nValid} & 0x1)) -eq 1 ]; then
  #...snip...
fi

if [ $((${nValid} & 0x2)) -eq 2 ]; then
  #...snip...
fi
Créé 17/08/2010 à 17:18
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
3

Un script shell interprète comme un nombre décimal (base 10), à moins que ce nombre a un préfixe spécial ou notation. Un certain nombre précédé d'un 0 est octal (base 8). Un certain nombre précédé de 0x est hexadécimal (base 16). Un certain nombre avec # intégré évalue comme BASE # NUMBER (avec plage et restrictions notationnelles).

Ainsi, dans [ $((${nValid} & 0x1)) -eq 1 ], $nValidest avec anded 0x1et par rapport à décimal 1. De même , la deuxième comparaison aussi.

Lisez ce et ce pour les informations détaillées.

Créé 17/08/2010 à 17:33
source utilisateur

voix
3

Et est l'opérateur au niveau du bit. Vous demandez donc de faire une opération de bits et entre 0x1 et la valeur $ {} NVALID revient.

Pour plus d' informations sur les opérations au niveau du bit regarder ici.

Créé 17/08/2010 à 17:22
source utilisateur

voix
2

Cela pourrait être réécrite comme:

if (( nValid & 2#00000001 )); then
  #...snip...
fi

if (( nValid & 2#00000010 )); then
  #...snip...
fi

avec le nombre de chiffres binaires choisis pour être le plus approprié pour le contexte. Il est pas nécessaire de tester l'égalité si vous vérifiez un seul bit *. Vous pouvez toujours utiliser la représentation hexagonale si elle est plus logique. Les accolades et signe dollar ne sont pas nécessaires dans ce contexte.

Vous pouvez utiliser des constantes avec des noms significatifs au lieu des valeurs codées en dur:

declare -r FOO=$((2#00000001))
declare -r BAR=$((2#00000010))
if (( nValid & FOO )); then
  #...snip...
fi
if (( nValid & BAR )); then
  #...snip...
fi

* Vous aurez besoin de tester l'égalité si vous testez plusieurs bits en même temps:

if (( (nValid & (FOO | BAR)) == (FOO | BAR) )); then
  #...snip...
fi

Vous aurez besoin des parenthèses supplémentaires car ==a une priorité plus élevée que les opérateurs au niveau du bit.

Et de compensation mise en bits dans bash:

(( var |= FOO ))    # set the bits in FOO into var
(( var &= ~BAR ))   # clear the bits in BAR from var
Créé 17/08/2010 à 19:52
source utilisateur

voix
2

Il teste NVALID sur une base par bit.

Le bit ANDopérateur ( &) signifie que bit par bit, l'opérateur va faire une ANDcomparaison. Donc, si NVALID est un octet (8 bits), puis regardez à l'opération en binaire:

nValue & 0b00000001

Si nValue est 42, l'opération ressemblerait à ceci

(nValue = 0b00101010) & 0b00000001 => 0b00000000 // (does not have the last bit set)
(nValue & 0b00000001) == 0b00000001 // false

et pour le 2ème ( nValid & 0x2)

(nValue = 0b00101010) & 0b00000010 => 0b00000010 // (has the 2nd-to-last bit set)
(nValue & 0b00000010) == 0b00000010 // true

Ceci est utile pour tester des variables drapeaux au sein; habituellement vous utilisez le ANDpour vérifier les drapeaux en isolant bits et les ORà combiner des drapeaux.

0b00001000 | 0b00000010 | 0b00000001 => 0b00001011
Créé 17/08/2010 à 17:41
source utilisateur

voix
2

0x1et 0x2les notations hexadécimaux pour 1 et 2. &est l'opérateur au niveau du bit. Ce que ces lignes font est de tester la valeur NVALID si le bit le moins significatif (0x1) et le second bit le moins significatif (0x2) sont réglées.

Le système va comme ceci (notation C):

if (val & (1 << bitNumber) == (1 << bitNumber)) {
  // The bit at position bitNumber (from least to most significant digit) is set
}

Le <<est l'opérateur bitshift gauche. 1 << 0 == 1, 1 << 1 == 2, 1 << 2 == 4, ...

Donc, pour une meilleure lisibilité des lignes devraient être plus comme:

if [ $((${nValid} & X)) -eq X ]; then

où X est une puissance de 2 (au lieu de hexadécimal de mélange et la notation décimale).

Créé 17/08/2010 à 17:41
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more