Циклический битовый сдвиг в PHP

Discussion in 'PHP' started by slesh, 3 Jun 2010.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Очень нужно реализовать на PHP функцию циклического сдвига 32 битного числа.

    в ассемблере просто всё - ror/rol а в PHP такого нет.
    Вообще нашел только << и >> но это не циклический сдвиг.
    Пытался сам реализовать через операции
    $k = $k >> 3 + $k << 29;

    В других языках (компилируемых) такое прокатилобы, а вот в PHP почемуто не пашет.
     
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    http://www.rinatous.com/blog/node/1.html
     
    1 person likes this.
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    и? В чем смысл того, что ты дал? Там рассматриваются непосредственно операции над битами, это есть в любой доке по PHP
    А тут нужно именно циклический сдвиг
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    фуф. вопрос решил сам. почемуто такое стало работать
    $k = ($k << 29) + ($k >> 3);
    и в одном месте chr() забыл
     
    #4 slesh, 3 Jun 2010
    Last edited: 3 Jun 2010
  5. roxblnfk

    roxblnfk Elder - Старейшина

    Joined:
    6 Feb 2010
    Messages:
    189
    Likes Received:
    42
    Reputations:
    19
    Такое работает не при всех вариантах. Если левый бит равен 1, то заливка слева после смещения будет единицами, что при сложении не допустимо..
    Написал код (про моём тестировании всё нормально):
    PHP:
    $k=bindec('11111100110011001100110011000000');
    echo 
    sprintf('%032b',$k).'<br>';
    for(
    $a=1;$a<=32;$a++){
        
    $b=32-$a;
        
    $s = (($k >> $a) & ~(-pow(2,$b)))^($k << $b);
        echo 
    sprintf('%032b',$s).'<br>';
    }
    Результат:
    При использовании твоего кода:
    как видно в первых строках нули не появляются слева
     
    #5 roxblnfk, 3 Jun 2010
    Last edited: 3 Jun 2010
    1 person likes this.
  6. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    ну да, надо скобки ставить. и в сях вообще-то тоже надо. У сдвигов приоритет выше (вроде) только чем у присваивания.
    И лучше не + писать, а |.