[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Top] [Table des matières] [Index] [ ? ]

3.8 Opérations de bits sur les entiers

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.

Function: lsh integer1 count

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
Function: ash integer1 count

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
Function: logand &rest ints-or-markers

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
Function: logior &rest ints-or-markers

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
Function: logxor &rest ints-or-markers

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
Function: lognot integer

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.