Преобразования бит/значение PHP работают не так, как ожидалось


ОБНОВЛЕНИЕ:

Для гуглеров вот исправленная версия:

Pastebin.com/tPVWM4MF


Я пытаюсь создать класс, который может интерпретировать целочисленные значения так же, как это делают некоторые функции php по умолчанию (например, error_reporting(E_ERROR | E_WARNING | E_PARSE);). По какой-то причине некоторые из моих результатов имеют неожиданные результаты (см. Код).

Смотрите эту страницу для получения дополнительной информации о: Побитовых операторах

Как я могу исправить эти неожиданные результаты?

В Код:

<?php

class bitwise {
    private $xchng = array(
        'bit' => array(
            0000,  0001,
            0010,  0011,
            0100,  0101,
            0110,  0111,
            1000,  1001,
            1010,  1011,
            1100,  1101,
            1110,  1111
        ),
        'val' => array(
            0000 =>  0,  0001 =>  1,
            0010 =>  2,  0011 =>  3,
            0100 =>  4,  0101 =>  5,
            0110 =>  6,  0111 =>  7,
            1000 =>  8,  1001 =>  9,
            1010 => 10,  1011 => 11,
            1100 => 12,  1101 => 13,
            1110 => 14,  1111 => 15
        )
    );

    public function create_bit_str($int_input){
        $xchng = $this->xchng['bit'];
        // convert value to bits
        $vals = str_split((string) $int_input,2);
        $values = '';
        foreach ($vals as $val) {
            $val = (int) $val;
            if(isset($xchng[$val])){
                $values .= $xchng[$val];
            }else{
                return FALSE;
            }
        }
        return (int) $values;
    }

    public function create_val_str($int_input){
        $xchng = $this->xchng['val'];
        // convert bits to value
    }
}


$bit = new bitwise;
var_dump($bit->create_bit_str(12 & 10)); // output 1000 (expected)
var_dump($bit->create_bit_str(12 | 10)); // output 1110 (expected)
var_dump($bit->create_bit_str(12 ^ 10)); // output 72 (unexpected) should be 0110 or 110
Author: Nicholas Jordon, 2013-08-05

1 answers

Сбросьте содержимое вашего массива "бит". Вы не получаете тех ценностей, о которых думаете. Заключите их в кавычки, и вы получите ожидаемые результаты.

Изменить: сделайте то же самое в своем массиве vals. Вы указываете десятичные числа. Другими словами, 0010 означает десять , а не два.

 0
Author: GreatBigBore, 2013-08-05 19:03:20