【问题标题】:PHP debug_backtrace bitmask usagePHP debug_backtrace 位掩码使用
【发布时间】:2012-06-30 19:06:16
【问题描述】:

试图理解debug_backtrace上的php手册中的这个条目。

我不明白“这个参数是……的位掩码”是什么意思

我已经在位掩码上进行了网络搜索,但我的脑袋正在转,所以我决定我真的不想了解它的细节,而只是想知道我应该如何将选项添加到该功能。

我是否将两个选项都放入

debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, DEBUG_BACKTRACE_IGNORE_ARGS)

如果我想要两个,如果我只想要其中一个?

【问题讨论】:

    标签: php bit-manipulation stack-trace bitmask


    【解决方案1】:

    请注意,这 2 个常量(DEBUG_BACKTRACE_PROVIDE_OBJECT、DEBUG_BACKTRACE_IGNORE_ARGS)的含义不同。虽然 DEBUG_BACKTRACE_PROVIDE_OBJECT 在存在时提供了一个额外的对象,但 DEBUG_BACKTRACE_IGNORE_ARGS 在存在时去除 args。

    由于这些常量最常见的用例是减少内存使用,因此内存消耗最少的方法是:

    debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
    

    不是

    // false friend!
    debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS);
    

    它会覆盖默认的 DEBUG_BACKTRACE_PROVIDE_OBJECT 并另外忽略 DEBUG_BACKTRACE_IGNORE_ARGS。

    【讨论】:

    • 正是我想要的解释。
    【解决方案2】:

    常量的十进制值为 2^n,二进制值为 (10)^n。例如 - 1、10、100、1000 等(二进制)。

    a=001, b=010, c=100:

    您可以按位或按位进行操作,例如 ab。这意味着如果 a 或 b 中的同一位“打开”,则每个位都将“打开”。

    a | b == 011
    

    这是一个位掩码。通过

    检查位掩码是否包含a
    bitmask & a != 0
    

    这是

    011 & 001 == 001 != 0
    

    但是,因为 c 不在位掩码中:

    bitmask & c == 011 & 100 == 0
    

    因此,要在位掩码中同时包含 a 和 b,请使用 二元或 运算符。

    debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS);
    

    【讨论】:

    • 是的……非常清楚。接受前一个,因为它排在第一位,但为了表示感谢而投了赞成票。一个小的后续问题是是否可以将位掩码加载到 php 变量 $x = a | b; 中。
    • 是的,位掩码只是一个整数,所以它可以像任何其他表达式一样使用。
    【解决方案3】:

    这意味着您将选项与按位或运算符组合:|

    例如:

     debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS);
    

    有关位掩码的更多详细信息:http://en.wikipedia.org/wiki/Mask_(computing)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多