FilterIterator битовая маска (или битовое поле) - PullRequest
0 голосов
/ 20 марта 2011

Я борюсь с битовыми масками (или это битовые поля?).Я не уверен, как это сделать.

Я хочу создать DirectoryFilterIterator, который принимает флаги того, что фильтровать.Я думал, что буду использовать эти биты для этого:

const DIR_NO_DOT = 1;
const DOT        = 2;
const DIR        = 3;
const FILE       = 4;

Поскольку DOT также считается DIR, я бы хотел иметь возможность различать и эти два.Если я прав, я подумал, что что-то подобное может быть возможно следующим образом:

DirectoryFilterIterator::DIR & ~DirectoryFilterIterator::DOT

Другими словами, это должно отфильтровать DIR, если это не DOT.Но я полностью застрял в том, как заставить работать фильтрацию (в методе accept):

class DirectoryFilterIterator
    extends FilterIterator
{
    const DIR_NO_DOT = 1;

    const DOT        = 2;

    const DIR        = 3;

    const FILE       = 4;

    protected $_filter;

    public function __construct( DirectoryIterator $iterator, $filter = self::DIR )
    {
        parent::__construct( $iterator );
        $this->_filter = $filter;
    }

    public function accept()
    {
        $item = $this->getInnerIterator()->current();
        return (
            !( ( $this->_filter & self::DOT ) == self::DOT && $item->isDot() ) &&
            !( ( $this->_filter & self::DIR ) == self::DIR && $item->isDir() ) &&
            !( ( $this->_filter & self::FILE ) == self::FILE && $item->isFile() )
        );
    }
}

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

1 Ответ

1 голос
/ 20 марта 2011

При использовании битовых масок вам нужно установить их значения в степени двух.Если для DIR установлено значение 3, это означает, что он является синонимом как для DIR_NO_DOT, так и для DOT вместе взятых.

Попробуйте установить их значения примерно так:

const DOT  = 1;
const DIR  = 2;
const FILE = 4;

Теперь вы можете проверить, является лиDIR, но не DOT с выражением DIR & !DOT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...