<?php
/*
* Aqui estão os exemplos.
*/
echo "\n--- MOVENDO BITS A DIREITA EM INTEIROS POSITIVOS ---\n";
$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'cópia do bit de sinal trocada para a esquerda');
$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);
$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'move os bits para fora da direita');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'mesmo resultado que acima; não se pode mover além do 0');
echo "\n--- MOVENDO BITS A DIREITA EM INTEIROS NEGATIVOS ---\n";
$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'cópia do bit de sinal trocada para a esquerda');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'move os bits para fora da direita');
$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'mesmo resultado que acima; não se pode mover além do -1');
echo "\n--- MOVENDO BITS A ESQUERDA EM INTEIROS POSITIVOS ---\n";
$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'preenche com zeros o lado direito');
$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, 'bit de sinal movido para fora');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'bits movidos para fora da esquerda');
echo "\n--- MOVENDO BITS A ESQUERDA EM INTEIROS NEGATIVOS ---\n";
$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'preenche com zeros o lado direito');
$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, 'bits movidos para fora pela esquerda, incluindo o bit de sinal');
/*
* Ignore essa seção abaixo,
* é apenas para formatar a saída e deixar mais clara a apresentação.
*/
function p($res, $val, $op, $places, $note = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";
printf("Expressão: %d = %d %s %d\n", $res, $val, $op, $places);
echo " Decimal:\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);
echo " Binário:\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);
if ($note) {
echo " NOTA: $note\n";
}
echo "\n";
}
?>
Saída do exemplo acima em máquinas de 32 bits:
--- MOVENDO BITS A DIREITA EM INTEIROS POSITIVOS ---
Expressão: 2 = 4 >> 1
Decimal:
val=4
res=2
Binário:
val=00000000000000000000000000000100
res=00000000000000000000000000000010
NOTA: cópia do bit de sinal trocada para a esquerda
Expressão: 1 = 4 >> 2
Decimal:
val=4
res=1
Binário:
val=00000000000000000000000000000100
res=00000000000000000000000000000001
Expressão: 0 = 4 >> 3
Decimal:
val=4
res=0
Binário:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
NOTA: move os bits para fora da direita
Expressão: 0 = 4 >> 4
Decimal:
val=4
res=0
Binário:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
NOTA: mesmo resultado que acima; não se pode mover além do 0
--- MOVENDO BITS A DIREITA EM INTEIROS NEGATIVOS ---
Expressão: -2 = -4 >> 1
Decimal:
val=-4
res=-2
Binário:
val=11111111111111111111111111111100
res=11111111111111111111111111111110
NOTA: cópia do bit de sinal trocada para a esquerda
Expressão: -1 = -4 >> 2
Decimal:
val=-4
res=-1
Binário:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
NOTA: move os bits para fora da direita
Expressão: -1 = -4 >> 3
Decimal:
val=-4
res=-1
Binário:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
NOTA: mesmo resultado que acima; não se pode mover além do -1
--- MOVENDO BITS A ESQUERDA EM INTEIROS POSITIVOS ---
Expressão: 8 = 4 << 1
Decimal:
val=4
res=8
Binário:
val=00000000000000000000000000000100
res=00000000000000000000000000001000
NOTA: preenche com zeros o lado direito
Expressão: 1073741824 = 4 << 28
Decimal:
val=4
res=1073741824
Binário:
val=00000000000000000000000000000100
res=01000000000000000000000000000000
Expressão: -2147483648 = 4 << 29
Decimal:
val=4
res=-2147483648
Binário:
val=00000000000000000000000000000100
res=10000000000000000000000000000000
NOTA: bit de sinal movido para fora
Expressão: 0 = 4 << 30
Decimal:
val=4
res=0
Binário:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
NOTA: bits movidos para fora da esquerda
--- MOVENDO BITS A ESQUERDA EM INTEIROS NEGATIVOS ---
Expressão: -8 = -4 << 1
Decimal:
val=-4
res=-8
Binário:
val=11111111111111111111111111111100
res=11111111111111111111111111111000
NOTA: preenche com zeros o lado direito
Expressão: -2147483648 = -4 << 29
Decimal:
val=-4
res=-2147483648
Binário:
val=11111111111111111111111111111100
res=10000000000000000000000000000000
Expressão: 0 = -4 << 30
Decimal:
val=-4
res=0
Binário:
val=11111111111111111111111111111100
res=00000000000000000000000000000000
NOTA: bits movidos para fora pela esquerda, incluindo o bit de sinal
Saída do exemplo acima em máquinas de 64 bits:
--- MOVENDO BITS A DIREITA EM INTEIROS POSITIVOS ---
Expressão: 2 = 4 >> 1
Decimal:
val=4
res=2
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000010
NOTA: cópia do bit de sinal trocada para a esquerda
Expressão: 1 = 4 >> 2
Decimal:
val=4
res=1
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000001
Expressão: 0 = 4 >> 3
Decimal:
val=4
res=0
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
NOTA: move os bits para fora da direita
Expressão: 0 = 4 >> 4
Decimal:
val=4
res=0
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
NOTA: mesmo resultado que acima; não se pode mover além do 0
--- MOVENDO BITS A DIREITA EM INTEIROS NEGATIVOS ---
Expressão: -2 = -4 >> 1
Decimal:
val=-4
res=-2
Binário:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111110
NOTA: cópia do bit de sinal trocada para a esquerda
Expressão: -1 = -4 >> 2
Decimal:
val=-4
res=-1
Binário:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
NOTA: move os bits para fora da direita
Expressão: -1 = -4 >> 3
Decimal:
val=-4
res=-1
Binário:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
NOTA: mesmo resultado que acima; não se pode mover além do -1
--- MOVENDO BITS A ESQUERDA EM INTEIROS POSITIVOS ---
Expressão: 8 = 4 << 1
Decimal:
val=4
res=8
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000001000
NOTA: preenche com zeros o lado direito
Expressão: 4611686018427387904 = 4 << 60
Decimal:
val=4
res=4611686018427387904
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0100000000000000000000000000000000000000000000000000000000000000
Expressão: -9223372036854775808 = 4 << 61
Decimal:
val=4
res=-9223372036854775808
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=1000000000000000000000000000000000000000000000000000000000000000
NOTA: bit de sinal movido para fora
Expressão: 0 = 4 << 62
Decimal:
val=4
res=0
Binário:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
NOTA: bits movidos para fora da esquerda
--- MOVENDO BITS A ESQUERDA EM INTEIROS NEGATIVOS ---
Expressão: -8 = -4 << 1
Decimal:
val=-4
res=-8
Binário:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111000
NOTA: preenche com zeros o lado direito
Expressão: -9223372036854775808 = -4 << 61
Decimal:
val=-4
res=-9223372036854775808
Binário:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1000000000000000000000000000000000000000000000000000000000000000
Expressão: 0 = -4 << 62
Decimal:
val=-4
res=0
Binário:
val=1111111111111111111111111111111111111111111111111111111111111100
res=0000000000000000000000000000000000000000000000000000000000000000
NOTA: bits movidos para fora pela esquerda, incluindo o bit de sinal