<?php
/*
 * これが例です
 */
echo "\n--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---\n";
$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copy of sign bit shifted into left side');
$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);
$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits shift out right side');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'same result as above; can not shift beyond 0');
echo "\n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---\n";
$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copy of sign bit shifted into left side');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'bits shift out right side');
$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'same result as above; can not shift beyond -1');
echo "\n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---\n";
$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'zeros fill in right side');
$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, 'sign bits get shifted out');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'bits shift out left side');
echo "\n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---\n";
$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'zeros fill in right side');
$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 shift out left side, including sign bit');
/*
 * このへんは無視してください。
 * たんに結果をきれいに表示させるためだけのものです。
 */
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 " Decimal:\n";
  printf("  val=%d\n", $val);
  printf("  res=%d\n", $res);
  echo " Binary:\n";
  printf('  val=' . $format, $val);
  printf('  res=' . $format, $res);
  if ($note) {
      echo " NOTE: $note\n";
  }
  echo "\n\n";
}
?>
    
   上の例の 32 ビットマシンでの出力は、このようになります。
--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 >> 1
 Decimal:
val=4
res=2
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side
Expression: 1 = 4 >> 2
 Decimal:
val=4
res=1
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000001
Expression: 0 = 4 >> 3
 Decimal:
val=4
res=0
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
 NOTE: bits shift out right side
Expression: 0 = 4 >> 4
 Decimal:
val=4
res=0
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0
--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
val=-4
res=-2
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side
Expression: -1 = -4 >> 2
 Decimal:
val=-4
res=-1
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
 NOTE: bits shift out right side
Expression: -1 = -4 >> 3
 Decimal:
val=-4
res=-1
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1
--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 << 1
 Decimal:
val=4
res=8
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000001000
 NOTE: zeros fill in right side
Expression: 1073741824 = 4 << 28
 Decimal:
val=4
res=1073741824
 Binary:
val=00000000000000000000000000000100
res=01000000000000000000000000000000
Expression: -2147483648 = 4 << 29
 Decimal:
val=4
res=-2147483648
 Binary:
val=00000000000000000000000000000100
res=10000000000000000000000000000000
 NOTE: sign bits get shifted out
Expression: 0 = 4 << 30
 Decimal:
val=4
res=0
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
 NOTE: bits shift out left side
--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 << 1
 Decimal:
val=-4
res=-8
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111000
 NOTE: zeros fill in right side
Expression: -2147483648 = -4 << 29
 Decimal:
val=-4
res=-2147483648
 Binary:
val=11111111111111111111111111111100
res=10000000000000000000000000000000
Expression: 0 = -4 << 30
 Decimal:
val=-4
res=0
 Binary:
val=11111111111111111111111111111100
res=00000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit
 
   上の例の 64 ビットマシンでの出力は、このようになります。
--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 >> 1
 Decimal:
val=4
res=2
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side
Expression: 1 = 4 >> 2
 Decimal:
val=4
res=1
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000001
Expression: 0 = 4 >> 3
 Decimal:
val=4
res=0
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out right side
Expression: 0 = 4 >> 4
 Decimal:
val=4
res=0
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0
--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
val=-4
res=-2
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side
Expression: -1 = -4 >> 2
 Decimal:
val=-4
res=-1
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: bits shift out right side
Expression: -1 = -4 >> 3
 Decimal:
val=-4
res=-1
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1
--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 << 1
 Decimal:
val=4
res=8
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000001000
 NOTE: zeros fill in right side
Expression: 4611686018427387904 = 4 << 60
 Decimal:
val=4
res=4611686018427387904
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0100000000000000000000000000000000000000000000000000000000000000
Expression: -9223372036854775808 = 4 << 61
 Decimal:
val=4
res=-9223372036854775808
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=1000000000000000000000000000000000000000000000000000000000000000
 NOTE: sign bits get shifted out
Expression: 0 = 4 << 62
 Decimal:
val=4
res=0
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side
--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 << 1
 Decimal:
val=-4
res=-8
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111000
 NOTE: zeros fill in right side
Expression: -9223372036854775808 = -4 << 61
 Decimal:
val=-4
res=-9223372036854775808
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1000000000000000000000000000000000000000000000000000000000000000
Expression: 0 = -4 << 62
 Decimal:
val=-4
res=0
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit