Я понимаю как побитовый оператор &
а также |
работать для двоичных чисел. Однако я запутался в том, как они работают с восьмеричными числами.
Система сначала преобразовывает число в двоичное, а затем выполняет операцию, а затем преобразовывает обратно в восьмеричное? Или это переменная?
Например, если я сделаю один из этих:
echo decoct( 0400 & 0500 | 0000 );
echo decoct( 0600 & 0500 | 0000 );
я получил 400
в результате.
Однако, если я сделаю:
echo decoct( 0400 & 0500 | 0100 );
echo decoct( 0600 & 0500 | 0100 );
я получил 500
в обоих случаях.
Кроме того, я видел код, где побитовая операция в PHP без использования decoct
вокруг него. Сохраняет ли PHP его как восьмеричное после завершения операции? или преобразует его в десятичную (и когда он это делает?).
Пожалуйста, направьте меня в правильном направлении к тому, что изучать и научиться понимать восьмеричные (и десятичные и другие) побитовые операции.
Битовые операторы «к счастью» работают для двоичных, восьмеричных и шестнадцатеричных представлений ваших значений / переменных. В конце они все будут работать на двоичном уровне ваших значений / переменных. Группировка ваших цифр / битов идеально подходит для побитовых операторов.
0400 = 0b100000000 = 0x100 (0001 0000 0000)
& 0500 = 0b101000000 = 0x140 (0001 0100 0000)
----------------------------
0400 = 0b100000000 = 0x100 (0001 0000 0000)
| 0100 = 0b001000000 = 0x040 (0000 0100 0000)
----------------------------
0500 = 0b101000000 = 0x140 (0001 0100 0000)
И для другого выражения:
0600 = 0b110000000 = 0x180 (0001 1000 0000)
& 0500 = 0b101000000 = 0x140 (0001 0100 0000)
----------------------------
0400 = 0b100000000 = 0x100 (0001 0000 0000)
| 0100 = 0b001000000 = 0x040 (0000 0100 0000)
----------------------------
0500 = 0b101000000 = 0x140 (0001 0100 0000)
Это работает для этих представлений, потому что «цифра» всегда будет использовать 1, 3 или 4 бита, и никакая другая «цифра» не может перезаписать эти «зарезервированные» цифры.
Побитовые операции выполняются над битами значений (отсюда и имя). Представление / отображение значений не имеет значения для побитовых операций.
Других решений пока нет …