2017-02-09 105 views
0

Я работаю над математической задачей, где формула: А [я] * (-2) мощность яГлядя на противоположный мощны() в PHP

где i=0,1,2,3,...

А представляет собой массив, имеющий значения 0 или 1

Входной массив: [0,1,1,0,0,1,0,1,1,1,0,1,0,1,1]

Выход: 5730

С ode

$totalA = 0; 
foreach ($A as $i => $a) { 
    $totalA += $a * pow(-2, $i); 
} 

Это правильно. Теперь я ищу свою противоположность, как:

входа является: 5730

выхода будет: [0,1,1,0,0,1,0,1,1,1,0,1,0,1,1]

Я не прошу для точного кода, но ищу какую-то логику от того, где я должен начать. Я пытался использовать метод log(), но не возвращал желаемый результат.

+4

Ваш первый пример - преобразование некоторого двоичного кода (младшего разряда LSB) [0,1,1,0,0,1,0,1,1,1,0,1,0,1,1] в десятичный 5730. Итак в основном вы хотите преобразовать десятичное число, например 5730 - бинарный? – barny

+0

Да, но отрицательный двоичный код. –

+0

Ну, это не «отрицательный двоичный» в смысле «двоичный код отрицательного числа». Поскольку не все десятичные числа (например, 3-15) могут быть представлены в вашем странном нелинейном двоичном формате, может быть простейшим предварительное вычисление тех, которые делают, сохраняя их в таблице поиска. Вот ты, @fafl просто сделал это за тебя. – barny

ответ

1

Вы не искали точный код, но я нашел эту проблему слишком интересной. Это работает:

function sign($n) { 
    return ($n > 0) - ($n < 0); 
} 

$target = -2396; 
$i = 0; 
$currentSum = 0; 

// Look for max $i 
while (true) { 
    $val = pow(-2, $i); 
    $candidate = $currentSum + $val; 
    if (abs($target) <= abs($candidate)) { 
     // Found max $i 
     break; 
    } 
    if (abs($target - $candidate) < abs($target - $currentSum)) { 
     // We are getting closer 
     $currentSum = $candidate; 
    } 
    $i++; 
} 

$result = []; 
for ($j = $i; 0 <= $j; $j--) { 
    $val = pow(-2, $j); 
    $border = $val/4; 
    if (sign($val) == sign($target) && abs($border) < abs($target)) { 
     array_unshift($result, 1); 
     $target -= $val; 
    } else { 
     array_unshift($result, 0); 
    } 
} 

echo json_encode($result); 

Сначала я смотрю на $i, который получает меня или немного выше $target. Когда я нахожусь, я спускаюсь и решаю для каждого бита, если он должен быть в результате.

+0

Спасибо за попытку, но это не удалось с этим вводом: [0,0,1,0,0,1,1,1,1,1,0,1], выход: -2396 и с входом -2396, это не дает ожидаемого результата. –

+0

Да, он работает, но результат отличается. Это должно быть: [0,0,1,0,0,1,1,1,1,1,0,1], а не [0,1,1,0,0,1,0,1,1, 1,0,1,0,1,1]. –

+0

Извините, мой плохой. Работая :) Тем не менее, ища более эффективный подход. Еще раз спасибо. –