【问题标题】:FilterIterator bitmask (or bitfield)FilterIterator 位掩码(或位域)
【发布时间】:2011-03-20 09:47:23
【问题描述】:

我正在为位掩码(或者它是位域?)而苦苦挣扎。我不知道该怎么做了。

我想创建一个 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() )
        );
    }
}

...尤其是因为我正在进行的所有否定,我有点迷失了。我怎样才能让它正常工作?

【问题讨论】:

    标签: php bit-fields bitmask filter-iterator


    【解决方案1】:

    使用位掩码时,您需要将其值设置为 2 的幂。如果将 DIR 设置为 3,则表示它是 DIR_NO_DOT 和 DOT 组合的同义词。

    尝试将它们的值设置为这样的:

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

    现在您可以使用表达式DIR & !DOT 来检查项目是否是 DIR 而不是 DOT。

    【讨论】:

      猜你喜欢
      • 2019-11-19
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多