【问题标题】:How to decode hexadecimal bitmask with php?如何用php解码十六进制位掩码?
【发布时间】:2015-03-14 18:45:03
【问题描述】:

我有一个包含位掩码字段的数据库,我有一个十六进制位掩码列表,如下所示:

2^8 256 = Type 1
2^9 512 = Type 2
2^0 001 = Type 3
2^4 016 = Type 4
2^1 002 = Type 5
2^5 032 = Type 6

我正在尝试“解码”(不确定正确的术语)
使用 php 的位掩码是什么,例如:003

我怎么知道003002 & 001 的组合?

拜托,我对此一无所知,请帮忙解释一下。
我需要能够用 php 来做到这一点。

【问题讨论】:

  • if ($mask & 1) { echo 'bit 1 is set'; } if ($mask & 2) { echo 'bit 2 is set'; } if ($mask & 4) { echo 'bit 3 is set'; } if ($mask & 8) { echo 'bit 4 is set'; }

标签: php hex bitmask


【解决方案1】:

首先,您应该为您的值定义常量:

const TYPE1 = 0b01000000;
const TYPE2 = 0b10000000;
const TYPE3 = 0b00000001;
const TYPE4 = 0b00010000;
const TYPE5 = 0b00000010;
const TYPE6 = 0b00100000;

这会让你保持清醒。我使用二进制(0b 表示法),但您可以轻松使用十六进制(0x)或十进制;我认为二进制可以最容易地查看哪个位代表哪个常量,并且当您定义新常量时,您可以轻松查看哪些位已被使用。请记住,常量的名称是区分大小写的……但只要坚持使用 ALL_CAPS 常量,您以后会省去很多麻烦。

然后您可以根据@MarkBaker 的评论使用逻辑运算符& 来测试每一个:

if ($mask & TYPE1) echo "Type 1 is set\n";
if ($mask & TYPE2) echo "Type 2 is set\n";
if ($mask & TYPE3) echo "Type 3 is set\n";
if ($mask & TYPE4) echo "Type 4 is set\n";
if ($mask & TYPE5) echo "Type 5 is set\n";
if ($mask & TYPE6) echo "Type 6 is set\n";

对于值 3 的示例,您将获得以下输出:

Type 3 is set
Type 5 is set

另外,在 PHP(和许多其他语言)中工作时需要注意 - 用前导零编写的数字,例如032 在你的问题中,被解释为八进制!因此032实际上不是32,而是26

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2021-02-28
    • 2016-07-17
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多