)
  • Побитовое НЕ (~)
  • Сдвиг влево (<<)
  • Сдвиг вправо (>>)
  • Побитовые операторы выполняют низкоуровневые манипуляции с битами в двоичных представлениях чисел. Эти операторы редко используются в программировании на PHP, поэтому если вы не знакомы с двоичным представлением целых чисел, то можете пропустить этот раздел. Побитовые операторы выполняют поразрядные операции булевой алгебры над отдельными битами операндов.

    В наличии PHP есть 6 побитовых операторов:

    Побитовое И (&)

    Оператор & выполняет операцию логическое И над каждым битом своих операндов. Бит результата устанавливается, если соответствующий бит установлен в обоих операндах.

    Пример работы оператора «Побитовое И»:

    И 0011
    0101
    0001

    Тоже самое только на примере PHP:

    
    <?php
    
      $x = 3;         // .  $y;   // ...0110 (6)
    
    ?>
    

    Побитовое НЕ (~)

    Оператор ~ (побитовое НЕ) представляет собой унарный оператор, указываемый перед своим единственным операндом. Он выполняет инверсию всех битов операнда. Из-за способа представления целых со знаком в PHP применение оператора ~ к значению эквивалентно изменению его знака и вычитанию 1.

    Пример работы оператора «Побитовое НЕ»:

    НЕ
    01
    10

    Тоже самое только на примере PHP:

    
    <?php
    
      $y = 5;     // ...0101
    
      echo ~$y;   // ...1010 (-6)
    
    ?>
    

    Осталось рассмотреть два оператора — сдвиг влево и сдвиг вправо. Эти операторы можно использовать для быстрого умножения и деления (каждая позиция подразумевает «умножение/деление на 2»).

    Сдвиг влево (<<)

    Оператор << сдвигает все биты в первом операнде влево на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения влево на одну позицию эквивалентен умножению на 2, на две позиции — умножению на 4 и т.д.

    Пример работы оператора «Сдвиг влево»:

    
    <?php
    
      $y = 5;         // 000000101
    
      // тоже самое что и 5 * 4
      echo $y << 2;   // 000010100 (20)
    
    ?>
    

    Сдвиг вправо (>>)

    Оператор >> сдвигает все биты в первом операнде вправо на количество позиций, указанное во втором операнде, который должен быть целым числом. Сдвиг значения вправо на одну позицию эквивалентен делению на 2, на две позиции — делению на 4 и т.д.

    Пример работы оператора «Сдвиг вправо»:

    
    <?php
    
      $y = 20;         // 000010100
    
      // тоже самое что и 20 / 4
      echo $y >> 2;   // 000000101 (5)
    
    ?>
    

    Помимо описанных операторов, в PHP также предусмотрены и сокращенные формы записи побитовых операторов.

    Сокращенная запись побитовых операторов
    ОператорОписаниеПримерСокращенная форма записи
    &=Присваивает левому операнду результат работы Побитового И$x = $x & $y$x &= $y
    |=Присваивает левому операнду результат работы Побитового ИЛИ$x = $x | $y$x |= $y
    ^=Присваивает левому операнду результат работы Исключающего ИЛИ$x = $x ^ $y$x ^= $y
    >>=Присваивает левому операнду результат работы оператора Сдвига вправо$x = $x >> 6$x >>= 6
    <<=Присваивает левому операнду результат работы оператора Сдвига влево$x = $x << 6$x <<= 6

    С этой темой смотрят:

    • Выражения и операторы
    • Арифметические операторы
    • Операторы сравнения
    • Логические операторы

    PHP: Побитовые операторы | PHP

    0 ∞

    Битовые операторы позволяют работать с поразрядным представлением аргументов. $yЗадаются биты, которые установлены в $x или в $y, но не в обоих сразу.~Not~$xБиты, которые установлены в $x, не задаются. И наоборот.<<Shift left$x << $yСмещение битов $x на $y шагов влево.#>>Shift right$x >> $yСмещение битов $x на $y шагов вправо.*

    # Каждый шаг означает «умножить на два».
    * Каждый шаг означает «поделить на два».

    • Что такое бит?
      • Байт
        • Табличное представление байта
      • Побитовый оператор AND
        • Пример побитового оператора PHP AND с одним общим битом
        • Пример побитового оператора PHP AND с двумя общими битами
      • Побитовый оператор OR
      • Побитовый оператор XOR
        • Пример использования побитового оператора PHP XOR
      • Побитовый оператор NOT
        • Пример использования побитового оператора PHP NOT после оператора AND
        • Пример использования битовой операции PHP NOT перед оператором AND
      • Сдвиг битов
        • Пример использования побитового оператора сдвига влево
        • Еще один пример использования оператора сдвига влево
        • Пример использования побитового оператора сдвига вправо
        • Еще один пример использования оператора сдвига вправо
        • Пример использования оператора сдвиг вправо с превышением значения шага

    В PHP битовых операциях бит (двоичный разряд) — это базовая единица информации, хранящаяся в вычислительной системе, которая существует в двух возможных состояниях, представленных как ON или OFF. В компьютерной системе состояние ON рассматривается как состояние 1, а OFF — 0. Эти состояния можно сравнить с двумя состояниями электрического переключателя (ВКЛ и ВЫКЛ) и т.п.

    Значения задаются в двоичной системе исчисления. В десятичной системе построение числа основано на 10. Давайте посмотрим, как можно построить десятичное число —

    231 = (2 ; 102 ) + (3 ; 101) + (1 ; 100)
    = 200 + 30 + 1
    = 231

    Система двоичных чисел следует той же концепции. Единственное отличие состоит в том, что база равна 2, а не 10. Посмотрим, как двоичное число преобразовать в десятичное —

    1011010=(1 x 26)+(0 x 25)+(1 x 24)+(1 x 23)+(0 x 22)+(1 x 21)+(0 x 20)
    =(1 x 64) +(0 x 32)+(1 x 16)+(1 x 8)+(0 x 4)+(1 x 2)+(0 x 1)
    =64+0+16+8+0+2+0
    =90

    Таким образом, (1011010)2= (90)10

    Байт состоит из последовательности битов. Байт состоит из восьми битов. Максимальное значение байта составляет 255. Таким образом устанавливается значение места каждого бита.

    1 байт (8 бит)
    8-ой7-ой6-ой5-ый4-ый3-ий2-ой1-ый
    Установленное значение1286432168421

    Табличное представление байта, демонстрирующее, как максимальное значение байта в битовой операции с числами составляет 255:

    1 байт (8 бит)
    Установленное значение1286432168421
    11111111
    2726252423222120
    1286432168421=255

    Десятичное число 93 может быть представлено в двоичной форме:

    1 байт (8 бит)
    Установленное значение1286432168421
    01011101
    2726252423222120
    0640
    16
    8401=93

    <?php  
    $x=13;  
    $y=22;  
    echo $x & $y;  
    ?>

    Результат примера:

    4

    Пояснение

    Опираясь на приведенные выше таблицы битовых операций, можно сказать, что единственный общий бит находится на третьей позиции с установленным значением 4. Таким образом, $x & $y = 4:

    1 байт (8 бит)
    Установленное значение1286432168421
    $x
    0
    0001101=13
    $y00010110=22

    В приведенной выше таблице для $x (13) установлено значение на первой, третьей и четвертой позиции. Значения позиции равны 1, 4 и 8. А для $y (22) значение установлено на второй, третьей и пятой позициях с соответствующими значениями: 2, 4 и 16.

    Единственный бит, который является общим для $x и $y — это третий. Поэтому возвращается 4.

    Рассмотрим другой пример оператора &, в котором больше бит.

    <?php  
    $x=77;  
    $y=198;  
    echo $x & $y;  
    ?>

    Результат примера PHP битовой операции:

    68

    Пояснение

    1 байт (8 бит)
    Place Value1286432168421
    $x01001101=77
    $y11000110=198

    В приведенной выше таблице значение установлено для $x (77) на первой, третьей, четвертой и седьмой позиции.

    Значения позиций равны 1, 4, 8 и 64. Значение для $y (198) установлено на второй, третьей, седьмой и восьмой позициях с соответствующими значениями: 2, 4, 64 и 128.

    Из приведенной выше таблицы видно, что общие для $x и $y — это третий и седьмой биты. Таким образом, возвращается 64 + 4 = 68.

    Пример побитового оператора PHP OR:

    <?php  
    $x=5;  
    $y=11;  
    echo $x | $y;  
    ?>

    Результат примера:

    15

    Пояснение

    1 байт (8 бит)
    Place Value1286432168421
    $x00000101=5
    $y00001011=11

    В приведенной выше таблице битовой операции с числами для $x (5) значение установлено на первой и третьей позициях. Значения позиций соответственно равны 1 и 4. Для $y (11) значения установлены на первой, второй и четвертой позициях с соответствующим значением: 1, 2 и 8.

    Для $x и $y общими являются первый, второй, третий или четвертый бит. Возвращаемое значение представляет собой добавление значений позиций битов, то есть: 8 + 4 + 2 + 1 = 15.

    Оператор Xor также выполняет побитовое сравнение двух числовых выражений и в результате устанавливает общий бит. Когда одно и только одно выражение является истинным, тогда он возвращает true.

    В приведенной ниже таблице показано, как выполняется операция XOR:

    Выражение 1Выражение 2Результат
    FalseFalseFalse
    FalseTrueTrue
    TrueFalseTrue
    TrueTrueFalse

    В приведенной ниже таблице показано побитовое сравнение оператора XOR:

    Бит в Выражении 1Бит в Выражении 2Результат
    000
    011
    101
    1

    <?php  
    $x=12;  
    $y=11;  
    echo $x ^ $y;  
    ?>

    Результат примера PHP битовой операции:

    7

    Пояснение

    1 байт (8 бит)
    Значение позиции1286432168421
    $x00001100=12
    $y00001011=11

    В приведенной выше таблице для $x (12) установлено значение на третьей и четвертой позиции. Значения позиции равны 4 и 8. А для $y (11) значение задано на первой, второй и четвертой позиции с соответствующими значениями: 1, 2 и 8.

    $ x и $ y устанавливают вместе первый, второй, третий или четвертый бит. Но вместе они используют только 4-й бит. Поэтому возвращаемое значение представляет собой добавление места для них. Но не совместно используемый бит: 4 + 2 + 1 = 7.

    В приведенной ниже таблице будет показано, как оператор NOT выполняет операции с $x и $y и возвращает true, когда заданный в одном выражении бит не задан в другом выражении.

    <?php  
    $x=12;  
    $y=10;  
    echo $x & ~ $y;  
    ?>

    Результат примера:

    4

    Пояснение

    1 байт (8 бит)
    Значение позиции1286432168421
    $x00001100=12
    $y00001010=10

    В приведенной выше таблице для $x (12) значение установлено на третьей и четвертой позициях. Значения позиции равны 4 и 8. Для $y (10) значение установлено на второй и четвертой позициях с соответствующими значениями 2 и 8.

    Для $x и $y заданы биты на первой, второй, третьей и четвертой позициям, но общий для них только четвертый бит. Возвращаемое значение равно 4, так как это единственное значение, заданное для $x, но не заданное для $y.

    <?php  
    $x=12;  
    $y=10;  
    echo ~ $x &  $y;  
    ?>

    Результат примера:

    2

    Пояснение

    В этом случае возвращаемое значение равно 2, потому что бит установлен для $y, но не установлен для $x.

    Если a и b — это два числа. Оператор сдвига перемещает бит b на определенное количество позиций. Каждый шаг означает умножение на два (сдвиг влево). Если это сдвиг вправо, тогда каждый шаг означает деление на два.

    <?php  
    $x=8;  
    $y=3;  
    echo $x << $y;  
    ?>

    Результат примера битовой операции

    64

    Пояснение

    1 байт (8 бит)
    Значение позиции1286432168421
    $x00001000=8
    Результат01000000=64

    В приведенном выше примере берется значение $x, которое равно 8, и выполняется операция сдвига влево: 8 умножается на 2 три раза. Таким образом, мы получаем 8 x 2 x 2 x 2 = 64.

    <?php  
    $x=12;  
    $y=4;  
    echo  $x << $y;  
    ?>

    Результат примера:

    192

    Пояснение

    В приведенном выше примере берется значение $x, равное 12, и выполняется операция сдвига влево: умножается на 2 четыре раза. Таким образом, мы получаем 12 x 2 x 2 x 2 x 2 = 192.

    1 байт (8 бит)
    Значение позиции1286432168421
    $x00001100=12
    Результат11000000=192

    <?php  
    $x=8;  
    $y=3;  
    echo $x >> $y;  
    ?>

    Результат примера битовой операции с числами:

    1

    Пояснение

    1 байт (8 бит)
    Значение позиции1286432168421
    $x00001000=8
    Результат00000001=1

    В приведенном выше примере берется значение $x, которое равно 8, и выполняется операция сдвига вправо: 8 делится на 2 три раза. Таким образом, получаем 8/2 = 4/2 = 2/2 = 1.

    <?php  
    $x=96;  
    $y=5;  
    echo  $x >> $y;  
    ?>

    Результат примера:

    3

    Пояснение

    1 байт (8 бит)
    Значение позиции1286432168421
    $x01100000=96
    Результат00000011=3

    В приведенном выше примере берется значение $x, равное 96, и выполняется операция сдвига вправо: 96 делится на 2 пять раз. Таким образом, мы получаем 96/2 = 48/2 = 24/2 = 12/2 = 6/2 = 3.

    <?php  
    $x=64;  
    $y=7;  
    echo  $x >> $y;   
    ?>

    Результат примера PHP битовой операции:

    0

    Пояснение

    1 байт (8 бит)
    Значение позиции1286432168421
    $x01000000=64
    Результат00000000=0

    В приведенном выше примере берется значение $x, равное 64, и выполняется операция сдвига вправо: 64 делится на 2 семь раз. При делении в определенный момент нам нечего делить. Таким образом, результат равен 0.

    Вадим Дворниковавтор-переводчик статьи «PHP Bitwise operator»

    Дайте знать, что вы думаете по данной теме в комментариях. За комментарии, отклики, подписки, лайки, дизлайки низкий вам поклон!

    побитовых операторов в PHP | 5 лучших побитовых операторов в PHP, которые нужно знать

    Как следует из названия, побитовые операторы в PHP используются для выполнения операций на битовом уровне над операндами, над которыми они должны работать. Это делается путем преобразования этих операндов в их битовый уровень, а затем над ними выполняются необходимые вычисления. Некоторые математические операции могут быть выполнены на этом битовом уровне, а не на уровне логического значения для быстрой обработки.

    Лучшие побитовые операторы в PHP

    Ниже перечислены некоторые побитовые операторы в PHP:

    1. Побитовое И( & )

    Двоичные операторы работают с двумя операндами. В PHP оператор побитового И принимает два числа в качестве входных операндов и выполняет И над каждым битом этих двух чисел. Результат будет логическим и 1, если оба бита равны 1, и 0 в любом другом случае.

    Синтаксис :

     $first_op & $sec_op 

    & — символ, используемый для выполнения этой операции.

    Пример :

      

    Вывод:

    Ниже приведено двоичное представление чисел 61 и 32 в таблице. В соответствии с символом И он дает на выходе 1, только если оба бита содержат 1 и возвращают 0 в любом другом случае. Таким образом, как показано ниже, только 3-й бит соответствует условию, и, следовательно, окончательный вывод равен 32. 128 64 32 16 8 4 2 1 $a 0 0 1 1 1 1 0 1 = 61 $b 0 0 1 0 0 0 0 0 = 32 Выход 0 0 1 0 0 0 0 0 = 32

    2.
    Побитовое ИЛИ( | )

    Подобно двоичному И, побитовое ИЛИ принимает два числа в качестве входных операндов и выполняет операцию ИЛИ над каждым битом этих двух чисел, и результатом является логическое значение. Он возвращает 1, если один из битов или оба бита равны 1. Следовательно, результат будет 0, только если обе цифры равны 0.

    Синтаксис :

     $first_op | $sec_op 

    | является символическим представлением побитового ИЛИ.

    Пример :

      

    Вывод:

    Ниже приведено двоичное представление 50 и 36 соответственно, как показано в таблице. В соответствии с операцией ИЛИ мы видим, что во 2-м, 3-м, 5-м и 6-м битах есть цифры, равные 1, поэтому соответствующая позиция ниже также будет 1, а остальные цифры заполнены 0, поскольку они не удовлетворяют условию . Следовательно, окончательный результат, который мы получаем, равен 54,9.0003

    9)

    Это бинарный оператор, который принимает на вход два числа в качестве операндов и выполняет операцию XOR над каждым их битом, и результат этих двух чисел будет истинным, если один из битов истинен, и выход будет ложным, если оба биты истинны, и оба бита ложны. Приведенную ниже таблицу можно использовать для ссылки на то же самое.

    Разрядное значение 128 64 32 16 8 4 2 1
    $a 0 0 1 1 0 0 1 0
    и б ВЫХОД
    0$б; ?>

    Вывод:

    Ниже приведено двоичное представление чисел 22 и 31 соответственно, показанное в таблице. В приведенной ниже таблице мы видим, что в 5-м и 8-м битах один из битов равен 1, следовательно, на выходе эти биты равны 1, а остальные равны 0. Результирующий результат равен 9 при преобразовании в десятичное число.

    Разрядное значение 128 64 32 16 8 4 2 1
    $a 0 0 0 1 0 1 1 0 = 22
    $b 0 0 0 1 1 1 1 1 = 31
    Выход 0 0 0 0 1 0 0 1 = 9
    4.
    Побитовое НЕ( ~ )

    В отличие от вышеперечисленных операторов, это унарный оператор, поэтому он выполняет побитовое НЕ над одним операндом, взятым на вход. Как следует из названия, вывод побитового НЕ является полной противоположностью его ввода.

    Синтаксис :

     ~ $first_op 

    ~ используется для побитового НЕ.

    Пример :

     

    Вывод:

    В приведенном выше коде мы сначала выполняем побитовое НЕ со вторым оператором, а затем комбинируем его с побитовым И с первым оператором, чтобы получить вывод. В приведенной ниже таблице мы можем увидеть результат после того, как НЕ выполнено с $y, и окончательный вывод, который равен 20 в десятичном формате.

    Разрядное значение 128 64 32 16 8 4 2 1
    $a 0 0 0 1 0 1 0 0 = 20
    $b 0 1 0 0 0 0 0 1 = 65
    ~$b 1 0 1 1 1 1 1 0 = 190
    Выход 0 0 0 1 0 1 0 0 = 20
    5.
    Сдвиг битов

    Эта операция немного отличается от описанных выше операций и включает сдвиг битов. Существует 2 типа смещения, которые могут быть выполнены: сдвиг влево и сдвиг вправо.

    Сдвиг влево(
    << )

    Здесь входные биты сдвигаются влево на заданное количество разрядов.

    Синтаксис :

     $first_op << $n 

    где $n указывает количество позиций, на которые должны быть сдвинуты биты.

    Пример :

      

    Вывод:

    Здесь мы задаем сдвиг двоичного числа 4 на 3 цифры влево. Следовательно, в результате мы получаем 32.

    Разрядное значение 128 64 32 16 8 4 2 1
    $a 0 0 0 0 0 1 0 0 = 4
    Выход 0 0 1 0 0 0 0 0 = 32
    Сдвиг вправо ( >> )

    Здесь мы сдвигаем входные биты вправо на указанное количество позиций.

    Синтаксис :

     $first_op >> $n 

    где $n — количество мест, на которое нужно сдвинуть.

    Пример :

     > $b;
    ?> 

    Вывод:

    Здесь мы сдвигаем двоичную цифру 7 на два бита вправо. Следовательно, в результате мы получаем 1.

    Разрядное значение 128 64 32 16 8 4 2 1
    $a 0 0 0 0 0 1 1 1 = 7
    выход 0 0 0 0 0 0 0 1 = 1

    Вывод

    Выше мы рассмотрели все основные побитовые операции, используемые в PHP. Как следует из их названия, они могут работать только с каждым битом входных данных, а не с целыми числами. Они по-прежнему используются в современном кодировании, поскольку имеют несколько преимуществ по сравнению с нынешним объединением, поскольку хранение и выборка данных относительно меньше и, следовательно, также повышает производительность.

    Рекомендуемые статьи

    Это руководство по битовым операторам в PHP. Здесь мы обсудим основную концепцию, различные побитовые операторы в PHP с примерами и синтаксисом. Вы также можете ознакомиться с другими нашими статьями по теме, чтобы узнать больше –

    1. Поиск массива PHP
    2. PHP-шифрование
    3. Продолжить в PHP
    4. PHP Запись в файл
    Обработка

    битов. Что означает >> в PHP?

    спросил

    Изменено 4 года, 6 месяцев назад

    Просмотрено 5к раз

    Рассмотрим:

     эхо 50 >> 4;
     

    Выход:

     3
     

    Почему выводится 3?

    • php
    • битовые манипуляции

    1

    50 в двоичном виде равно 11 0010 , сдвиг вправо на 4 дает 11 , что равно 3.

    См. документацию по PHP и Википедию.

    3

    Как указано на php.org, >> оператор — это оператор побитового сдвига, который сдвигает биты вправо:

    $a >> $b — Сдвинуть биты шагов $a $b вправо (каждый шаг означает «делить на два»)

    50 в двоичном виде равно 110010 , а оператор >> сдвигает эти биты на 4 позиции в вашем примере кода. Хотя это происходит за одну операцию, вы можете представить это как в несколько шагов, например:

    • Шаги 1 - 00011001
    • Шаг 2 - 00001100
    • Этап 3 - 00000110
    • Этап 4 - 00000011

    Поскольку двоичное число 11 равно 3 в десятичном виде, код выводит 3.

    3

    Арифметический сдвиг вправо.

    Оператор >> называется оператором двоичного сдвига вправо .

    Сдвиг битов вправо 4 раза равен делению на два, четыре раза подряд. Результат в этом случае будет 3.125 . Поскольку 50 — это целое число, побитовый сдвиг вернет нижний предел этого числа, то есть 3 .

    Иными словами, 50 — это 0b110010 в двоичном виде. Сдвинув 4 раза, мы получим 0b11 , что равно 3 в десятичном виде.

    >> — бинарный оператор сдвига вправо.

    Ваша инструкция сдвигает биты в числовом значении 50 на четыре позиции вправо. Поскольку все целые числа представлены в дополнении до двух, это равно 3. Простой способ запомнить это состоит в том, что один сдвиг вправо равен делению на 2, а один сдвиг влево равен умножению на 2.

    0

    Это называется сдвиг вправо. 'Биты левого операнда сдвигаются вправо на количество позиций правого операнда. Освобожденные слева битовые позиции заполняются знаковым битом, а биты, сдвинутые вправо, отбрасываются».

    Информацию по нему можно найти здесь: http://php.comsci.us/etymology/operator/rightshift.php

    1

    Смещает биты вниз на четыре позиции.

    50 в двоичном формате равно 110010.

    Сдвиг на четыре разряда вниз равен 11, что равно 3.

    Для вашего удобства один из самых быстрых способов вычислить выходное значение из побитового сдвига — умножить или разделить на 2.

    Например, эхо 50 >> 4;

    Учитывая, что это побитовое право, это буквально означает, что значение будет уменьшаться, тогда мы можем получить результат, разделив 50 на 2 и 4 раза.

    эхо 50 >> 4; // 50/(2*2*2*2) ~ 3.

    Учитывая, что (от) 48 -> (до) 63/16(2*2*2*2), результат будет больше 2 и меньше 4. Тогда

    эхо 48 >> 4; // 48/(2*2*2*2) ~ 3.

    эхо 63 >> 4; // 63/(2*2*2*2) ~ 3.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *