这是一个与语言无关的问题,虽然我已经使用语言标记了一些标签,这些标签与我在下面发布的代码示例相关。我对编程有些新意。在各种语言中,我发现函数的参数与我认为的按位OR
运算符分开。我已经使用过这些功能,却没有准确理解参数的工作原理。
如果您不确定我在谈论什么,我会举一些例子。
来自http://www.php.net/manual/en/function.error-reporting.php:
<?php
// Turn off all error reporting
error_reporting(0);
// 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
error_reporting(E_ALL & ~E_NOTICE);
// Report all PHP errors (see changelog)
error_reporting(E_ALL);
// Report all PHP errors
error_reporting(-1);
// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>
来自http://www.cplusplus.com/doc/tutorial/files/:
ofstream myfile ("example.bin", ios::out | ios::app | ios::binary);
对于那些采用这样的参数的函数到底有什么处理?有人可以解释一下吗?
答案 0 :(得分:4)
如果你查找那些常数是什么,你会发现它们会是这样的:1,2,4,8,16等。
所以基本上将它们全部加在一起,(AFAIK在这方面的含义是什么:“PHP中的位移是算术。”)你得到一个新的“数字”。
http://us2.php.net/manual/en/language.operators.bitwise.php
手册页有很多关于它如何工作的好信息。
所以基本上回答这个函数是如何工作的问题,它接受一个整数,并且按位运算符正在执行“数学运算”并将这三个常量转换为一个新数字。
var_dump(E_ERROR);
var_dump(E_WARNING);
var_dump(E_PARSE);
var_dump(E_ERROR | E_WARNING | E_PARSE);
int(1)
int(2)
int(4)
int(7)
所以它与:
相同error_reporting(7);
答案 1 :(得分:0)
与a + b + c
相同。这只是一个表达,有
|
(按位或)运算符。
答案 2 :(得分:0)
这些是predefined constants,其值被组合以产生位字段。
您可以在PHP中使用decbin()
来深入了解这些常量的工作原理。 decbin
生成一个字符串,显示数字的二进制表示。
printf("%02s", decbin(E_ERROR)); // output 01
printf("%02s", decbin(E_WARNING)); // output 10
printf("%02s", decbin(E_ERROR | E_WARNING)); // output 11
(我填充了所有值,以便明确OR
操作)
您将一个数字传递给该函数,该函数的值表示您要启用的选项。在函数中,可以使用按位&
:
function func($flag) {
if ($flag & E_ERROR) echo "E_ERROR enabled";
// etc.
}
答案 3 :(得分:-1)
这些是旗帜。有时函数会收到多个关于如何操作的指示,例如是以二进制模式还是以只读模式打开文件等...这种模式不是互斥的 - 文件可以打开以便在文本和文本中读取二进制模式,或以文本和二进制模式写入。因此,如果需要,您需要能够同时指定两个选项。
实现此目的的一种简单方法是使用位标志。您有一个包含所有标志的整数。例如,最低有效位表示如果要以文本模式打开文件(0 - 文本,1 - 二进制),右边的第二位表示是否打开以进行读取或写入......
要实现此功能,请使用常量:
BINARY = 1
WRITE = 2
现在,如果要以二进制和写入模式打开,可以使用BINARY | WRITE
- 这会产生3.
然后被调用的函数将数字分解为位:
isBinary = (flags & BINARY) != 0;
isWriteMode = (flags % WRITE) != 0;
答案 4 :(得分:-4)
我认为
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
等同于C或C ++中的以下内容
// Report simple running errors
int const error_filter = E_ERROR | E_WARNING | E_PARSE;
error_reporting( error_filter );
最有可能的是,符号E_ERROR,E_WARNING是具有单个位设置的数字,例如
E_ERROR = 00000001
E_WARNING = 00000010
E_PARSE = 00000100
因此,它们的按位或返回一个数字,其中所有位置都设置了位
error_filter = E_ERROR | E_WARNING | E_PARSE = 00000111
一个棘手的问题是error_filter
的类型,我写了int
,但这可能不是很迂腐。可以说uint32_t
。另一种方法是完全保留原始代码中的类型。