[ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] | [Top] | [Table des matières] | [Index] | [ ? ] |
Dans un ordinateur, un nombre entier est représenté comme nombre binaire, une séquence de bits (des chiffres qui sont zéro ou un). Une opération de bits agit sur les bits individuels d'une telle séquence. Par exemple, le shifting déplace l'ordre entier à gauche ou à droite d'une ou plusieures places, pour reproduire le même modèle “moved over.”
Les opérations de bits en Emacs Lisp s'appliquent seulement aux nombres entiers.
lsh
, qui est une abréviation de logical shift, décale les
bits dans integer1 de count places à gauche, ou vers la
droite si count est négatif, introduisant des zéros dans les
places vacantes des bits. Si count est négatif, lsh
décale les zéros dans l'extrême gauche du bit (plus fort), produisant
un résultat positif même si integer1 est négatif. Contrairement
à ash
, ci-dessous.
Voici deux exemples de lsh
, décalant une combinaison de
chiffres binaires d'une place vers la gauche. Nous montrons seulement
les huit bits faibles du binaire modèle; le reste est fait de zéro.
(lsh 5 1) ⇒ 10 ;; Decimal 5 becomes decimal 10. 00000101 ⇒ 00001010 (lsh 7 1) ⇒ 14 ;; La décimale 7 devient la décimale 14. 00000111 ⇒ 00001110 |
Comme ces exemples le montrent, lorsqu'on décale la combinaison de chiffres binaires d'une place vers la gauche, on produit un nombre qui est le double de la valeur du précédent nombre.
Lorsqu'on décale de deux places une combinaison de chiffres binaires vers la gauche, on produit les résultats suivants (avec des nombres binaires de 8 bits):
(lsh 3 2)
⇒ 12
;; La décimale 3 devient décimale 12.
00000011 ⇒ 00001100
|
D'autre part, le décalage d'une place vers la droite ressemble à ceci:
(lsh 6 -1) ⇒ 3 ;; La décimale 6 devient décimale 3. 00000110 ⇒ 00000011 (lsh 5 -1) ⇒ 2 ;; La décimale 5 devient décimale 2. 00000101 ⇒ 00000010 |
Comme l'exemple le montre, le décalage d'une place vers la droite divise la valeur d'un nombre entier positif par deux, arrondissant vers le bas.
La fonction lsh
, comme toutes les fonctions arithmétiques
d'Emacs Lisp, ne vérifie pas le débordement, ainsi de décalage à
gauche peut changer le bit fort et changer le signe du nombre. Par
exemple, le décalage à gauche de 268.435.455 produit -2 sur une
machine de 29 bits :
(lsh 268435455 1) ; left shift
⇒ -2
|
En binaire, dans l'exécution de 29 bits, l'argument ressemble à ceci:
;; La décimale 268 435 455
0 1111 1111 1111 1111 1111 1111 1111
|
ce qui devient, lorsqu'on décale à gauche:
;; La décimale -2
1 1111 1111 1111 1111 1111 1111 1110
|
ash
(arithmetic shift) décale les bits dans
integer1 de count places vers la gauche, ou vers la droite
si count est négatif.
ash
donne les mêmes résultats que lsh
excepté quand
integer1 et count sont tous les deux négatifs. Dans ce
cas, ash
met des 1 dans les positions de bit vide du côté
gauche, alors que lsh
met des 0 dans ces positions de bit.
Ainsi, ash
, décalant la combinaison de chiffres binaires d'une
place vers la droite ressemble à ceci:
(ash -6 -1)
⇒ -3
;; La décimale -6 devient la décimale -3.
1 1111 1111 1111 1111 1111 1111 1010
⇒
1 1111 1111 1111 1111 1111 1111 1101
|
En revanche, décaler la combinaison de chiffres binaires d'une place
vers la droite avec lsh
ressemble à ceci:
(lsh -6 -1)
⇒ 268435453
;; La décimale -6 devient la décimale 268 435 453.
1 1111 1111 1111 1111 1111 1111 1010
⇒
0 1111 1111 1111 1111 1111 1111 1101
|
Voici d'autres exemples:
; 29-bit binary values (lsh 5 2) ; 5 = 0 0000 0000 0000 0000 0000 0000 0101 ⇒ 20 ; = 0 0000 0000 0000 0000 0000 0001 0100 (ash 5 2) ⇒ 20 (lsh -5 2) ; -5 = 1 1111 1111 1111 1111 1111 1111 1011 ⇒ -20 ; = 1 1111 1111 1111 1111 1111 1110 1100 (ash -5 2) ⇒ -20 (lsh 5 -2) ; 5 = 0 0000 0000 0000 0000 0000 0000 0101 ⇒ 1 ; = 0 0000 0000 0000 0000 0000 0000 0001 (ash 5 -2) ⇒ 1 (lsh -5 -2) ; -5 = 1 1111 1111 1111 1111 1111 1111 1011 ⇒ 134217726 ; = 0 0111 1111 1111 1111 1111 1111 1110 (ash -5 -2) ; -5 = 1 1111 1111 1111 1111 1111 1111 1011 ⇒ -2 ; = 1 1111 1111 1111 1111 1111 1111 1110 |
Cette fonction renvoie le “et logique” des arguments: le nth bit est placé dans le résultat si, et seulement si, le nth bit est placer dans tous arguments. (“Placer” veut dire que la valeur du bit est 1 plutôt que 0.)
Par exemple, en utilisant des nombres binaires de 4 bits, le “et logique” de 13 et 12 est 12: 1101 combiné avec 1100 produit 1100. Dans les deux nombres binaires, les deux bits à l'extrême gauche sont placés (c.-à-d., ils sont à 1), ainsi les deux bits à l'extrême gauche de la valeur retournée sont placés. Cependant, pour les deux bits à l'extrême droite, chacun est à zéro dans au moins un des arguments, ainsi les deux bits à l'extrême droite de la valeur retournée sont 0.
Par conséquent,
(logand 13 12) ⇒ 12 |
Si logand
est passé sans argument, il renvoie une valeur
-1. Ce nombre est un élément d'identité pour logand
parce que sa représentation binaire consiste entièrement de 1. Si
logand
est passé à juste un argument, il renvoie cet argument.
; 29-bit binary values (logand 14 13) ; 14 = 0 0000 0000 0000 0000 0000 0000 1110 ; 13 = 0 0000 0000 0000 0000 0000 0000 1101 ⇒ 12 ; 12 = 0 0000 0000 0000 0000 0000 0000 1100 (logand 14 13 4) ; 14 = 0 0000 0000 0000 0000 0000 0000 1110 ; 13 = 0 0000 0000 0000 0000 0000 0000 1101 ; 4 = 0 0000 0000 0000 0000 0000 0000 0100 ⇒ 4 ; 4 = 0 0000 0000 0000 0000 0000 0000 0100 (logand) ⇒ -1 ; -1 = 1 1111 1111 1111 1111 1111 1111 1111 |
Cette fonction renvoie le “ou inclus” de ses arguments: le
nième bit est placé dans le résultat si, et seulement si, le
nième bit est placé dans au moins un des arguments. S'il n'y a
aucun argument, le résultat est 0, ce qui est un élément d'identité
pour cette opération. Si logior
est passé à juste un argument,
il renvoie cet argument.
; 29-bit binary values (logior 12 5) ; 12 = 0 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0 0000 0000 0000 0000 0000 0000 0101 ⇒ 13 ; 13 = 0 0000 0000 0000 0000 0000 0000 1101 (logior 12 5 7) ; 12 = 0 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0 0000 0000 0000 0000 0000 0000 0101 ; 7 = 0 0000 0000 0000 0000 0000 0000 0111 ⇒ 15 ; 15 = 0 0000 0000 0000 0000 0000 0000 1111 |
Cette fonction renvoie le “ou exclusif” de ses arguments: le
nième bit est placé dans le résultat si, et seulement si, le bit
nième bit est placé dans un nombre impair des arguments. S'il
n'y a aucun argument, le résultat est 0, qui est un élément d'identité
pour cette opération. Si logxor
est passé juste à un argument,
il renvoie cet argument.
; 29-bit binary values (logxor 12 5) ; 12 = 0 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0 0000 0000 0000 0000 0000 0000 0101 ⇒ 9 ; 9 = 0 0000 0000 0000 0000 0000 0000 1001 (logxor 12 5 7) ; 12 = 0 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0 0000 0000 0000 0000 0000 0000 0101 ; 7 = 0 0000 0000 0000 0000 0000 0000 0111 ⇒ 14 ; 14 = 0 0000 0000 0000 0000 0000 0000 1110 |
Cette fonction renvoie le complément logique de son argument: le nième bit est 1 dans le résultat si, et seulement si, le nième bit est 0 dans integer, et vice-versa.
(lognot 5) ⇒ -6 ;; 5 = 0 0000 0000 0000 0000 0000 0000 0101 ;; devient ;; -6 = 1 1111 1111 1111 1111 1111 1111 1010 |
[ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] | [Top] | [Table des matières] | [Index] | [ ? ] |
Ce document a été généré par Eric Reinbold le 13 Octobre 2007 en utilisant texi2html 1.78.