combovas
21.07.2014 - 14:32
У меня вопрос связанный с организацией цикла перебора, желательно последовательного (по возрастанию значений) всех возможных значений одного байта манипулируя только строковой переменной из 8 символов, каждый символ которой может быть либо '1' либо '0'.
Алгоритм мне не дается ни в какую..))) Единственное, что написал так это функцию, которая преобразует эту строковую переменную в десятичное число. Свои варианты алгоритмов перебора тут не публикую, потому, что все они получались очень неполными...
Итак дана переменная $cislo = "00000000";
Как заставить её поочередно принять все из 256 возможных значений байта?
<?php
function decimus($cislo)
{
$summa=0;
for($a =0;$a<=7;$a++)
{
if ($cislo[$a] !== "0"){
$summa += pow(2,$a);
}
}
return $summa;
}
$cislo = "00000000";
?>
Заранее спасибо.
SlavaFr
21.07.2014 - 17:26
<?
class StringBitOperations
{
private $binarString;
public function __construct($binarString)
{
$this->validateWithException($binarString);
$this->binarString = $binarString;
}
private function validateWithException($binarString)
{
if (!preg_match('/^[0|1]{7}$/', $binarString)) {
throw new Exception('format from binary string is broken, 7 digits 0 or 1');
}
}
public function addOne()
{
$over = 0;
for ($i = strlen($this->binarString) - 1; $i >= 0; $i--)
{
if ($this->binarString{$i} =='0' && $over ==1) {
$over = 0;
}
if ($this->binarString{$i} =='1') {
$over = 1;
$this->binarString{$i} = '0';
continue;
}
if ($this->binarString{$i} =='0') {
$this->binarString{$i} ='1';
return;
}
}
}
public function __toString()
{
return $this->binarString;
}
}
$operation = new StringBitOperations('0000010');
echo $operation."\n";
for($i=0; $i<50;$i++){
$operation->addOne();
echo $operation."\n";
}
if (bindec($operation) != 52) {
throw new Exception('my test is broken');
}
_____________
↓↓↓↓↓↓↓↓↓↓ответ может быть здесьили в mysql_error();