<?php
/*
* Voici quelques exemples
*/
echo "\n--- Décalages à droite sur des entiers positifs ---\n";
$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche');
$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);
$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'des bits sont sortis par la droite');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de 0');
echo "\n--- Décalages à droite sur des entiers négatifs ---\n";
$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'des bits sont sortis par la droite');
$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de -1');
echo "\n--- Décalages à gauche sur des entiers positifs ---\n";
$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'complément de zéros à droite');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 4;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = 4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places, 'le bit de signe est sorti');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'des bits sont sortis à gauche');
echo "\n--- Décalages à gauche sur des entiers négatifs ---\n";
$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'complément de zéros à droite');
$val = -4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = -4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'des bits sont sortis à gauche, y compris le bit de signe');
/*
* Ignorez cette section
* Elle contient du code pour le formatage de cet exemple
*/
function p($res, $val, $op, $places, $note = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";
printf("Expression : %d = %d %s %d\n", $res, $val, $op, $places);
echo " Décimal :\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);
echo " Binaire :\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);
if ($note) {
echo " Note : $note\n";
}
echo "\n";
}
?>
Résultat de l'exemple ci-dessus sur une machine 32 bits :
--- Décalages à droite sur des entiers positifs ---
Expression : 2 = 4 >> 1
Décimal :
val=4
res=2
Binaire :
val=00000000000000000000000000000100
res=00000000000000000000000000000010
Note : copie du bit de signe maintenant à gauche
Expression : 1 = 4 >> 2
Décimal :
val=4
res=1
Binaire :
val=00000000000000000000000000000100
res=00000000000000000000000000000001
Expression : 0 = 4 >> 3
Décimal :
val=4
res=0
Binaire :
val=00000000000000000000000000000100
res=00000000000000000000000000000000
Note : des bits sont sortis par la droite
Expression : 0 = 4 >> 4
Décimal :
val=4
res=0
Binaire :
val=00000000000000000000000000000100
res=00000000000000000000000000000000
Note : même résultat que ci-dessus : pas de décalage au dela de 0
--- Décalages à droite sur des entiers négatifs ---
Expression : -2 = -4 >> 1
Décimal :
val=-4
res=-2
Binaire :
val=11111111111111111111111111111100
res=11111111111111111111111111111110
Note : copie du bit de signe à gauche
Expression : -1 = -4 >> 2
Décimal :
val=-4
res=-1
Binaire :
val=11111111111111111111111111111100
res=11111111111111111111111111111111
Note : des bits sont sortis par la droite
Expression : -1 = -4 >> 3
Décimal :
val=-4
res=-1
Binaire :
val=11111111111111111111111111111100
res=11111111111111111111111111111111
Note : même résultat que ci-dessus : pas de décalage au dela de -1
--- Décalages à gauche sur des entiers positifs ---
Expression : 8 = 4 << 1
Décimal :
val=4
res=8
Binaire :
val=00000000000000000000000000000100
res=00000000000000000000000000001000
Note : complément de zéros à droite
Expression : 1073741824 = 4 << 28
Décimal :
val=4
res=1073741824
Binaire :
val=00000000000000000000000000000100
res=01000000000000000000000000000000
Expression : -2147483648 = 4 << 29
Décimal :
val=4
res=-2147483648
Binaire :
val=00000000000000000000000000000100
res=10000000000000000000000000000000
Note : le bit de signe est sorti
Expression : 0 = 4 << 30
Décimal :
val=4
res=0
Binaire :
val=00000000000000000000000000000100
res=00000000000000000000000000000000
Note : des bits sont sortis à gauche
--- Décalages à gauche sur des entiers négatifs ---
Expression : -8 = -4 << 1
Décimal :
val=-4
res=-8
Binaire :
val=11111111111111111111111111111100
res=11111111111111111111111111111000
Note : complément de zéros à droite
Expression : -2147483648 = -4 << 29
Décimal :
val=-4
res=-2147483648
Binaire :
val=11111111111111111111111111111100
res=10000000000000000000000000000000
Expression : 0 = -4 << 30
Décimal :
val=-4
res=0
Binaire :
val=11111111111111111111111111111100
res=00000000000000000000000000000000
Note : des bits sont sortis à gauche, y compris le bit de signe
Résultat de l'exemple ci-dessus sur une machine 64 bits :
--- Décalages à droite sur des entiers positifs ---
Expression : 2 = 4 >> 1
Décimal :
val=4
res=2
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000010
Note : copie du bit de signe maintenant à gauche
Expression : 1 = 4 >> 2
Décimal :
val=4
res=1
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000001
Expression : 0 = 4 >> 3
Décimal :
val=4
res=0
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
Note : des bits sont sortis par la droite
Expression : 0 = 4 >> 4
Décimal :
val=4
res=0
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
Note : même résultat que ci-dessus : pas de décalage au dela de 0
--- Décalages à droite sur des entiers négatifs ---
Expression : -2 = -4 >> 1
Décimal :
val=-4
res=-2
Binaire :
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111110
Note : copie du bit de signe maintenant à gauche
Expression : -1 = -4 >> 2
Décimal :
val=-4
res=-1
Binaire :
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
Note : des bits sont sortis par la droite
Expression : -1 = -4 >> 3
Décimal :
val=-4
res=-1
Binaire :
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
Note : même résultat que ci-dessus : pas de décalage au dela de -1
--- Décalage à gauche sur les entiers négatifs ---
Expression : 8 = 4 << 1
Décimal :
val=4
res=8
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000001000
Note : complément de zéros à droite
Expression : 4611686018427387904 = 4 << 60
Décimal :
val=4
res=4611686018427387904
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=0100000000000000000000000000000000000000000000000000000000000000
Expression : -9223372036854775808 = 4 << 61
Décimal :
val=4
res=-9223372036854775808
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=1000000000000000000000000000000000000000000000000000000000000000
Note : le bit de signe est sorti
Expression : 0 = 4 << 62
Décimal :
val=4
res=0
Binaire :
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
Note : des bits sont sortis à gauche
--- Décalage à gauche sur les entiers négatifs ---
Expression : -8 = -4 << 1
Décimal :
val=-4
res=-8
Binaire :
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111000
Note : complément de zéros à droite
Expression : -9223372036854775808 = -4 << 61
Décimal :
val=-4
res=-9223372036854775808
Binaire :
val=1111111111111111111111111111111111111111111111111111111111111100
res=1000000000000000000000000000000000000000000000000000000000000000
Expression : 0 = -4 << 62
Décimal :
val=-4
res=0
Binaire :
val=1111111111111111111111111111111111111111111111111111111111111100
res=0000000000000000000000000000000000000000000000000000000000000000
Note : des bits sont sortis à gauche, y compris le bit de signe