如何在PHP中实现的位掩码?(How to implement a bitmask in php?)

2019-06-26 22:05发布

我不知道,如果是位掩码正确的术语。 让我解释:

在PHP中error_reporting函数可以调用多种方式:

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

我从php.net页术语位掩码这里

反正这一点的是,我已经实现了一个名为SIMPLE方法ls返回一个目录的内容。

这个函数有3名ARGS ...($ include_hidden =假,$ return_absolute =假,$ EXT = FALSE)

因此,当我调用函数,我设置我多么希望的结果。 无论是我想要的结果返回隐藏的目录,我是否要只基本名称等。

因此,当我调用函数我写信

ls(true, false, true)
ls(false, false, true)
ls(true, true, true)
etc...

我认为这将是更具可读性如果我能标志I怎么想返回的数据?

所以是这样的:

ls( INCLUDE_HIDDEN | HIDE_EXTS );
ls( SHOW_ABSOLUTE_PATHS | HIDE_EXTS );

等等...

我怎么会在这标志已经被称为测试方面实现这一点?

Answer 1:

这是很简单的实际。 首先一点的代码来说明它是如何实现的。 如果你不理解的任何事情这个代码做什么或它是如何工作的,随便问在评论其他问题:

const FLAG_1 = 0b0001; // 1
const FLAG_2 = 0b0010; // 2
const FLAG_3 = 0b0100; // 4
const FLAG_4 = 0b1000; // 8
// Can you see the pattern? ;-)

function show_flags ($flags) {
  if ($flags & FLAG_1) {
    echo "You passed flag 1!<br>\n";
  }
  if ($flags & FLAG_2) {
    echo "You passed flag 2!<br>\n";
  }
  if ($flags & FLAG_3) {
    echo "You passed flag 3!<br>\n";
  }
  if ($flags & FLAG_4) {
    echo "You passed flag 4!<br>\n";
  }
}

show_flags(FLAG_1 | FLAG_3);

演示


因为国旗是整数,在32位平台上可以定义多达32个标志。 在64位的平台,这是64.另外,也可以定义标志为字符串,在这种情况下可用的标志的个数是(当然系统资源的范围内,)或多或少无限的。 下面是它如何工作的二进制(削减到8位整数的简单)。

FLAG_1
Dec:    1
Binary: 00000001

FLAG_2
Dec:    2
Binary: 00000010

FLAG_3
Dec:    4
Binary: 00000100

// And so on...

当你把这些标志将它们传递给函数,你还是在一起。 让我们来看看当我们通过会发生什么FLAG_1 | FLAG_3 FLAG_1 | FLAG_3

  00000001
| 00000100
= 00000101

而当你想看到哪些设置标志,你和标志位掩码。 所以,让我们上面的结果,看看是否FLAG_3设置:

  00000101
& 00000100
= 00000100

...我们得到的标志的值后面,一个非零整数-但如果我们看看FLAG_2设置:

  00000101
& 00000010
= 00000000

...我们得到零。 这意味着,当检查是否值传递你可以简单的与运算结果作为评价一个布尔值。



Answer 2:

define( "INCLUDE_HIDDEN", 0x1 );
define( "HIDE_EXTS", 0x2 );
define( "SHOW_ABSOLUTE_PATHS", 0x4 );
//And so on, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 etc..

然后,您可以为您在您的个人标志ls功能:

if( $flags & INCLUDE_HIDDEN ) { //<-- note just a single &, bitwise and
    //$flags have INCLUDE_HIDDEN
}


Answer 3:

其他人都提供了很好的建议,但这些天它的更常见的关联数组 ,而不是位掩码通过。 这是更可读,并允许您在不只是真/假值以外的其他变量传递。 事情是这样的:

myFunction(['includeHidden' => true, 'fileExts' => false, 'string' => 'Xyz']);

function myFunction($options) {
    // Set the default options
    $options += [
        'includeHidden' => false,
        'fileExts' => true,
        'string' => 'Abc',
    ];

    if ($options['includeHidden']) {
        ...
    }
    ...
}


文章来源: How to implement a bitmask in php?
标签: php bitmask