Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Глюк операции "<<" в 4.3.8 ?


Автор: xaoc2 30.10.2005, 11:47
Недавно в институте получил задание. Нарисовать блок-схему алгоритма конверсии десятичных цифр в бинарные. Обычно я прогоняю такие задания на PHP для экономии времени. Придумал алгоритм с операцией сдвига , но вывод - сюрприз для меня.
Здесь decbin() для контроля
Код

<?php

$a = 89898;

echo decbin($a) . "<br>";

for($i=0;$i<32;$i++){
  $b = $a << $i;
  echo $b >> 31;

}
?>


Вот вывод:
10101111100101010
000000000000000-10-10-1-1-1-1-100-10-10-10

Откуда чёрточки? Без них вроде бы всё сходится.

Автор: Mal Hack 30.10.2005, 13:36
Мож просто выводятся перед 1 именно.

Автор: xaoc2 30.10.2005, 22:08
Цитата(Mal @ 30.10.2005, 13:36)
Мож просто выводятся перед 1 именно.

Но ведь не должно по определению. При битовом сдвиге может быть 1 или 0.

Автор: Mayk 30.10.2005, 22:13
Цитата(Mal @ 30.10.2005, 17:36)
$b >> 31;

При побитовом сдвигании знаковый бит не меняется в данном случае.


Добавлено @ 22:14
То есть $b >> 31 вернет либо 0, либо -1.
Иными словами $b >> 31 заполняет все битиы знаковым.
хотя бы echo abs($b >> 31); спасёт мир smile
Добавлено @ 22:19
а если серьезно, то хотя бы
Код

for($i=0;$i<32;$i++){
  $b = ($a >> (31-$i)) & 1;
  echo $b;
}

Добавлено @ 22:22
или вообще разверни цикл
Код

for($i=31;$i>=0;$i--){
  echo ($a >> $i) & 1;
}

Автор: xaoc2 31.10.2005, 22:55
Большое спасибо, попутно неожиданно нашёл решение дркгой проблемы:
как прочитать произвольный бит числа.
Код

<?php
$a = 15689;
$bitKotoryjHotimProchitat = 4;

echo decbin($a)."<br>";
echo "Читаем бит номер" . $bitKotoryjHotimProchitat . "<br>";
echo ($a >> ($bitKotoryjHotimProchitat-1)&1);

?>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)