0

ビットマスクに苦労しています (またはビットフィールドですか?)。もうどうしたらいいのかわからない。

フィルタリング対象のフラグを受け入れる DirectoryFilterIterator を作成したいと考えています。そのためにこれらのビットを使用すると思いました:

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

aDOTも a と見なされるDIRため、これら 2 つも区別できるようにしたいと思います。私が正しければ、次のようにできるはずだと思いました。

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() )
        );
    }
}

...特に、私が行っているすべての否定のせいで、私はちょっと迷っています。これを正しく機能させるにはどうすればよいですか?

4

1 に答える 1

1

ビットマスクを使用する場合、値を 2 のべき乗に設定する必要があります。DIR を 3 に設定すると、DIR_NO_DOT と DOT を組み合わせたものと同義になります。

値を次のように設定してみてください。

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

項目が DIR であるが DOT ではないかどうかを式で確認できるようになりましたDIR & !DOT

于 2011-03-20T10:07:14.787 に答える