我遇到了以下代码段
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
Run Code Online (Sandbox Code Playgroud)
什么x ^ 0x1
意思?这是一些标准技术吗?
我对C编程很新,我遇到了掩码.有人可以向我解释位屏蔽的一般概念和功能吗?非常感谢例子.
假设我有以下内容
int susan = 2; //0010
int bob = 4; //0100
int karen = 8; //1000
Run Code Online (Sandbox Code Playgroud)
我将10(8 + 2)作为参数传递给方法,我想将其解码为苏珊和卡伦
我知道10是1010
但是我如何做一些逻辑来查看是否检查了特定位
if (condition_for_karen) // How to quickly check whether effective karen bit is 1
Run Code Online (Sandbox Code Playgroud)
现在,我能想到的是检查我通过的号码是否正确
14 // 1110
12 // 1100
10 // 1010
8 // 1000
Run Code Online (Sandbox Code Playgroud)
当我在我的真实场景中拥有更多的实际比特时,这似乎是不切实际的,使用掩码来检查我是否满足karen条件的更好方法是什么?
我可以想到向左移动然后向后移动然后向右移动然后移回到除了我感兴趣的那个之外的其他位置,但这似乎也过于复杂.
你知道在Cocoa中有这个东西,比如你可以创建一个UIView
并做:
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Run Code Online (Sandbox Code Playgroud)
我有一个UIView
具有多个状态的自定义,我已经在enum
这样定义:
enum DownloadViewStatus {
FileNotDownloaded,
FileDownloading,
FileDownloaded
};
Run Code Online (Sandbox Code Playgroud)
对于每个创建的子视图,我设置它tag
:subview1.tag = FileNotDownloaded;
然后,我有一个视图状态的自定义setter,它执行以下操作:
for (UIView *subview in self.subviews) {
if (subview.tag == viewStatus)
subview.hidden = NO;
else
subview.hidden = YES;
}
Run Code Online (Sandbox Code Playgroud)
但我想做的是允许这样做:
subview1.tag = FileNotDownloaded | FileDownloaded;
Run Code Online (Sandbox Code Playgroud)
所以我subview1
出现在我看来的两个状态.目前,由于|
运算符似乎添加了两个枚举值,因此它不会出现在这两个状态中的任何一个状态中.
有没有办法做到这一点?
我正在开发一个应用程序,其中用户具有使用不同功能的不同权限(例如,读取,创建,下载,打印,批准等).预计权限列表不会经常更改.我有几个如何在数据库中存储这些权限的选项.
选项2在哪些情况下更好?
使用关联表.
User ---- UserId (PK) Name Department
Permission ---- PermissionId (PK) Name
User_Permission ---- UserId (FK) PermissionId (FK)
为每个用户存储位掩码.
User ---- UserId (PK) Name Department Permissions
[Flags]
enum Permissions {
Read = 1,
Create = 2,
Download = 4,
Print = 8,
Approve = 16
}
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中拥有一组非常大的权限,我使用Flags枚举表示.它正在快速接近长数据类型的实际上限.我不得不提出一个战略,很快就会转变为一个不同的结构.现在,我可以将此列表分解为更小的部分,但是,根据我们的应用程序布局,这已经只是我们应用程序的总体权限的一部分.在管理权限时,我们广泛使用这种区别用于显示目的,如果我可以避免,我宁愿不再重新访问该代码.
还有其他人遇到过这个问题吗?你是怎么过去的?一般的例子很好,但我最感兴趣的是ac#specific example,如果有任何语言特定的技巧可以用来完成工作.
可能不是必需的,但这里是当前为我正在处理的应用程序部分定义的权限列表.
//Subgroup WebAgent
[Flags]
public enum WebAgentPermission : long
{
[DescriptionAttribute("View Rule Group")]
ViewRuleGroup = 1,
[DescriptionAttribute("Add Rule Group")]
AddRuleGroup = 2,
[DescriptionAttribute("Edit Rule Group")]
EditRuleGroup = 4,
[DescriptionAttribute("Delete Rule Group")]
DeleteRuleGroup = 8,
[DescriptionAttribute("View Rule")]
ViewRule = 16,
[DescriptionAttribute("Add Rule")]
AddRule = 32,
[DescriptionAttribute("Edit Rule")]
EditRule = 64,
[DescriptionAttribute("Delete Rule")]
DeleteRule = 128,
[DescriptionAttribute("View Location")]
ViewLocation = 256,
[DescriptionAttribute("Add Location")]
AddLocation = 512,
[DescriptionAttribute("Edit Location")]
EditLocation = 1024,
[DescriptionAttribute("Delete Location")]
DeleteLocation = 2048,
[DescriptionAttribute("View Volume Statistics")] …
Run Code Online (Sandbox Code Playgroud) I'm not sure if bitmask is the correct term. Let me explain:
In php, the error_reporting
function can be called multiple ways:
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);
Run Code Online (Sandbox Code Playgroud)
I got the term bitmask …
有没有办法比较Transact-SQL中的两个位掩码,看看是否有任何匹配的位?我有一个User表,其中包含用户所属角色的位掩码,我想选择所有在提供的位掩码中具有任何角色的用户.因此,使用下面的数据,角色位6(设计师+程序员)应选择Dave,Charlie和Susan,但不能选择Nick.
User Table ---------- ID Username Roles 1 Dave 6 2 Charlie 2 3 Susan 4 4 Nick 1 Roles Table ----------- ID Role 1 Admin 2 Programmer 4 Designer
有任何想法吗?谢谢.
您可能熟悉enum
位掩码方案,例如:
enum Flags {
FLAG1 = 0x1,
FLAG2 = 0x2,
FLAG3 = 0x4,
FLAG4 = 0x8,
NO_FLAGS = 0,
ALL_FLAGS = FLAG1 | FLAG2 | FLAG3 | FLAG4
};
f(FLAG2 | FLAG4);
Run Code Online (Sandbox Code Playgroud)
我已经看过很多代码,然后在掩码中测试一下
if ((mask & FLAG3) == FLAG3)
Run Code Online (Sandbox Code Playgroud)
但这不等于这个吗?
if (mask & FLAG3)
Run Code Online (Sandbox Code Playgroud)
有没有理由使用第一个版本?在我看来,第二个较短的版本更清晰.
也许C程序员的剩余习惯应该转换为真正的价值观1
?(即使在那里,较长的版本在赋值或return
语句中比在条件语句测试中更有意义.)
bitmask ×10
c ×3
c# ×3
c++ ×3
enums ×2
sql-server ×2
c++11 ×1
cocoa ×1
objective-c ×1
permissions ×1
php ×1
sql ×1
t-sql ×1
terminology ×1
types ×1