首页 > 解决方案 > java类Pattern中的位运算符逻辑

问题描述

在 java.regex.Pattern 中有以下声明:

public final class Pattern implements java.io.Serializable {
    ...
    private static final int UNIX_LINES = 0x01;
    private static final int CASE_INSENSITIVE = 0x02;
    private static final int COMMENTS = 0x04;
    private static final int MULTILINE = 0x08;
    private static final int LITERAL = 0x10;
    private static final int DOTALL = 0x20;
    private static final int UNICODE_CASE = 0x40;
    private static final int CANON_EQ = 0x80;
    private static final int UNICODE_CHARACTER_CLASS = 0x100;

    private Pattern(String p, int f) {
        if ((f & ~ALL_FLAGS) != 0) {
            throw new IllegalArgumentException("Unknown flag 0x"
                                               + Integer.toHexString(f));
        }
    ...
}

我试图了解检查是否存在未知标志的逻辑。

作为十六进制字符串

ALL_FLAGS  => 00000000000000000000000111111111
~ALL_FLAGS => 11111111111111111111111000000000

现在,如果我使用标志 0x03(不应该被允许),那么

0x03 & ~ALL_FLAGS => 00000000000000000000000000000000

因此,尽管未定义,但也允许使用该标志。只有标志 > 511 是不允许的。

这种逻辑背后的原因是什么?

标签: java

解决方案


感谢您的评论。“位掩码”是要搜索的术语。在这里找到了一个很好的解释


推荐阅读