java - java Android 检查标志位的所有值

标签 java android flags bit

我已阅读 this post为了检查 ApplicationInfo 的标志。但后来我读到this post为了看看是否有办法获取标志中包含的所有值,但我有点困惑。谁能告诉我是否有办法获得所有值并解释它?

提前致谢。

最佳答案

int 标志是这样工作的,你有一个整数,比如 48,在二进制中它是 0011 0000。这意味着它包含 2 个标志,一个是 0010 0000,另一个是 0001 0000。如果您检查 ApplicationInfo 标志,您会注意到所有值都是 2 的幂 (1,2,4,8..),这是因为 2 的幂的二进制表示形式全是零,只有一个 1。所以,按顺序要检查整数 48 包含哪些标志,您可以这样做(注意 & 运算符,它是按位 AND,如果您对此有疑问,请阅读 this ):

int value = 48;
int[] possibleFlags = {ApplicationInfo.FLAG_FACTORY_TEST, ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, ApplicationInfo.FLAG_ALLOW_BACKUP};
String[] flagNames = {"FLAG_FACTORY_TEST", "FLAG_ALLOW_TASK_REPARENTING", "FLAG_ALLOW_BACKUP"};

 for (int i = 0; i < possibleFlags.length; i++) {
    int aFlag = possibleFlags[i];
    String name = flagNames[i];
    boolean hasFlag = (value & aFlag) > 0;
    Log.d("Flags", String.format("flag %s %s", name, hasFlag ? "PRESENT" : "NOT PRESENT"));
}

我不太明白你所问的方法,但检查所有标志的另一种方法是迭代 2 从 1 到 31 的所有幂(对于像 java 这样的 4 字节整数),但你仍然需要链接数字到实际常数,有用吗?例如

for (int i = 0; i < 32; i++) {
    int aFlag = 1 << i;
    boolean hasFlag = (value & aFlag) > 0;
    Log.d("Flags", String.format("flag %s %s", aFlag, hasFlag ? "PRESENT" : "NOT PRESENT"));
}

关于java - java Android 检查标志位的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42483582/

相关文章:

java - java中额外导入类的影响

接口(interface)方法定义上的Java注释没有被处理?

java - Spock 测试因 MissingPropertyException 失败

java - 每次滚动/平移/拖动时,相机都会移回到原始位置

android - 锁定/解锁方向

language-agnostic - 按位检查标志是否存在

java - 这个叫什么? (就像二进制文件一样,我认为呢?)

java - 如何让 Spring Integration FTP 消息源直接生成 Message<String> 到 channel ,而不是创建文件

Android 凹凸 API

android - 读取加载配置文件的当前纸板设备参数