在关于JSON 的PHP 文档中,它提到了bitmask这个词.维基百科将其定义为面具.我不了解位掩码或掩码或它们如何有用.有人可以用外行的条款解释这些术语而不用行话吗?
您可以使用枚举类实现标准符合(如n3242草案的17.5.2.1.3所述)类型安全位掩码吗?我读它的方式,类型T是一个位掩码,如果它支持|,&,^,〜,| =,&=和^ =运算符,你还可以做if(l&r)其中l和r是T类型.列表中缺少的是运算符!=和==并允许排序一个也可能想要重载<.
让操作员工作只是烦人的样板代码,但我不知道如何(l&r).至少下面的代码不能用GCC编译(除了极其危险,因为它允许错误的隐式转换为int):
enum class Foo{
operator bool(){
return (unsigned)*this;
}
};
Run Code Online (Sandbox Code Playgroud)
编辑:我现在肯定知道枚举类不能有成员.实际问题如果(l&r)仍然存在.
我有以下内容:
public static final int LIMIT_ONE = 1;
public static final int TRADEABLE = (1 << 1);
public static final int SELLABLE = (1 << 2);
public static final int STORABLE = (1 << 3);
public static final int STORABLE_IN_WH = (1 << 4);
public static final int STORABLE_IN_LEGION_WH = (1 << 5);
public static final int BREAKABLE = (1 << 6);
public static final int SOUL_BOUND = (1 << 7);
public static final int UNK9 = (1 << 8); …
Run Code Online (Sandbox Code Playgroud) 就像是
SELECT COUNT(*) AS c FROM BANS WHERE typeid=6 AND (SELECT ipaddr,cidr FROM BANS) MATCH AGAINST 'this_ip';
因此,您不首先从数据库中获取所有记录,然后逐个匹配它们.
如果c> 0则匹配.
BANS表:
id int auto incr PK
typeid TINYINT (1=hostname, 4=ipv4, 6=ipv6)
ipaddr BINARY(128)
cidr INT
host VARCHAR(255)
Run Code Online (Sandbox Code Playgroud)
DB:MySQL 5
查询时已知IP和IPv6类型(4或6).
IP例如是二进制格式的:: 1
BANNED IP例如是:: 1/64
我有一个mysql表,其中用户权限存储为位掩码:
|user | permissions |
| Admin | 31 |
| User | 13 |
16 8 4 2 1
Admin -> 1 1 1 1 1 -> 16 + 8 + 4 + 2 + 1 -> 31
User -> 0 1 1 0 1 -> 8 + 4 + 1 -> 13
Run Code Online (Sandbox Code Playgroud)
现在我想为每个使用sql查询的用户添加权限.假设我想为每个人添加权限16而不修改另一个位.
UPDATE users SET permission = ????
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
假设我有一个类似于1010XXXX的字节,其中X值可以是任何值.我想将低4位设置为特定模式,比如1100,同时保持高4位不受影响.如何在C中以最快的速度完成这项工作?
我正在使用PHP的用户角色/权限系统来处理脚本.
下面是使用我在phpbuilder.com上找到的权限的位掩码方法的代码.
在那个部分下面是一个更简单的版本w3hich可以做基本相同的事情没有位部分.
许多人建议在PHP中使用位操作符等设置和其他东西,但我从来没有理解为什么.在下面的代码中,使用第一个代码而不是第二个代码有什么好处?
<?php
/**
* Correct the variables stored in array.
* @param integer $mask Integer of the bit
* @return array
*/
function bitMask($mask = 0) {
$return = array();
while ($mask > 0) {
for($i = 0, $n = 0; $i <= $mask; $i = 1 * pow(2, $n), $n++) {
$end = $i;
}
$return[] = $end;
$mask = $mask - $end;
}
sort($return);
return $return;
}
define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD', 2); …
Run Code Online (Sandbox Code Playgroud) 我有用户表,并希望按位掩码标准选择一些行.我会用小例子来解释我的问题.
表用户的结构
user_id int [primary key, auto_increment]
user_email varchar(200)
user_privileges int
Run Code Online (Sandbox Code Playgroud)
注意:它有更多字段,但它们与此问题无关.
填充表可能如下所示
+---------+--------------------+-----------------+
| user_id | user_email | user_privileges | << binary
+---------+--------------------+-----------------+
| 1 | john@example.com | 165 | 10100101
| 2 | max@example.com | 13 | 00001101
| 3 | trevor@example.com | 33 | 00100001
| 4 | paul@example.com | 8 | 00001000
| 5 | rashid@example.com | 5 | 00000101
+---------+--------------------+-----------------+
Run Code Online (Sandbox Code Playgroud)
现在我想按特定权限bitmask(按user_privileges
列)SELECT用户.
例如:
我想做这样的事情:
public enum Permissions
{
CanBlah1,
CanBlah2,
CanBlah3
}
byte[] userPerm = Permissions.CanBlah1 | Permissions.CanBlah2;
// check permssions
//
if(userPerm && Permissions.CanBlah1 == Permissions.CanBlah1)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
你能用Java做到这一点吗?(我来自ac#background)
我不太了解整个bitmask概念.
假设我有一个面具:
var bitMask = 8 | 524288;
Run Code Online (Sandbox Code Playgroud)
我已了解,这是我怎么会结合起来8
,并524288
和获得524296
.
但是,我该如何走另一条路呢?如何检查我的位掩码,看它是否包含8
和/或524288
?
为了使它更复杂,让我们说我的位掩码是18358536
,我需要检查是否8
和524288
在该位掩码.我到底怎么做?