我有一组选项,一些正交(可以任意组合组合),一些独占(允许只允许一组),并需要选择一组enum值,以便它们可以按比特组合or并提取有点位and.我希望 - or无效组合是可检测的.
有没有像这样生成的工具enums?
编辑清晰
我正在寻找能够利用某些标志组合无效以减少使用的位数的事实.我能够检测错误的要求是软的.如果事情被破坏,我不需要能够告诉我们使用了什么.
我正在使用C#,但任何解决方案都应该有用.
一个示例模式是:
0011 00
0101 00
1001 00
0110 00
1010 00
1100 00
0000 01
0000 10
Run Code Online (Sandbox Code Playgroud)
获得6个独占标志和一个2到6位的正交对
快速测试表明,5位给出9个值,6位给出20,...
使用枚举在C++中存储位标志有点麻烦,因为一旦枚举值被OR化,它们就会松开它们的枚举类型,这会导致错误而不进行显式转换.
这个问题的接受答案表明|运营商超载:
FlagsSet operator|(FlagsSet a, FlagsSet b)
{
return FlagsSet(int(a) | int(b));
}
Run Code Online (Sandbox Code Playgroud)
我想知道这种方法是否有任何运行时影响?
我有一个项目,其中许多对象通过维护简单的布尔标志来保持状态.有很多这些,所以我将它们保存在一个uint32_t并使用位屏蔽.现在有这么多的标志,以保持跟踪,我创建了一个抽象为他们(只是一个包装类的uint32_t)用set(),clear()等等.
我的问题:这个班级有什么准确,简洁的名字?我可以给这个课程什么名字,以便你有一个合理的想法,因为只知道这个名字是什么?
我有一些想法:
有任何想法吗?
提前致谢!
干杯,
-Chris
当我尝试使用macOS Sierra 10.12.6中的bitflags v1.0.1在Rust中构建项目时,代码失败并出现以下错误:
Compiling bitflags v1.0.1
error: expected ident, found #
--> /Users/kenneth.marete/.cargo/registry/src/github.com-1ecc6299db9ec823/bitflags-1.0.1/src/lib.rs:423:29
|
423 | #[allow(deprecated)]
| ^
|
::: /Users/kenneth.marete/.cargo/registry/src/github.com-1ecc6299db9ec823/bitflags-1.0.1/src/example_generated.rs
|
4 | / bitflags! {
5 | | /// This is the same `Flags` struct defined in the [crate level example](../index.html#example).
6 | | /// Note that this struct is just for documentation purposes only, it must not be used outside
7 | | /// this crate.
... |
13 | | }
14 | | …Run Code Online (Sandbox Code Playgroud) 我刚刚发现了bitflags的乐趣.我有几个关于在C语言中使用bitflags的"最佳实践"的问题.我从网上找到的各种例子中学到了一些东西,但仍然有问题.
为了节省空间,我在struct(A->flag)中使用单个32位整数字段来表示几组不同的布尔属性.总共有20个不同的位#define.其中一些是真正的存在/不存在标志(STORAGE-INTERNAL与STORAGE-EXTERNAL).其他人有两个以上的值(例如互斥的格式集:FORMAT-A,FORMAT-B,FORMAT-C).我已经定义了用于设置特定位的宏(同时关闭互斥位).如果在标志中设置了特定的位组合,我还定义了用于测试的宏.
但是,上述方法中丢失的是标记的特定分组,最好由枚举捕获.对于编写函数,我想使用枚举(例如,STORAGE-TYPE和FORMAT-TYPE),以便函数定义看起来不错.我希望仅使用枚举来传递参数,使用#defined宏来设置和测试标志.
(a)如何A->flag以便携方式(跨32位/ 64位平台)将flag()定义为32位整数?
(b)我是否应该担心如何存储A->flag与#defined常量与枚举相比的潜在大小差异?
(c)我是否使事情变得不必要地复杂化,这意味着我应该坚持使用#defined常量来传递参数作为普通的ints?在这一切中我还应该担心什么?
我为这个表达不清的问题道歉.它反映了我对潜在问题的无知.
我有一个byte我用来存储位标志.我有8个标志(每个位一个),可以分成4对2个标志,它们是互斥的.我已按以下方式安排了位标志:
ABCDEFGH
10011000
Run Code Online (Sandbox Code Playgroud)
当标志B也被设置时,不能设置标志A,反之亦然,因此标志A和B是互斥的.标志A和B都可以取消设置,而不是两者都设置.标志C&D,标志E&F和标志G&H也是如此.
当前测试用例(C语言):
#include <stdio.h>
int check(char b) { // used to check invariant
return ((b&0xC0)==0xC0||(b&0x30)==0x30||(b&0x0C)==0x0C||(b&0x03)==0x03)?0:1;
}
int main() {
char input[256] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
char truth[256] = {
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int i,r;
int f = 0;
for(i=0; i<256; ++i) {
r=check(input[i]);
if(r != truth[i]) …Run Code Online (Sandbox Code Playgroud) 我的深度有点偏僻.
我正在使用Object Inspector中包含一些Flags的组件...
FCOPY
Flags
flShowProgress
flConfirmation
Run Code Online (Sandbox Code Playgroud)
我需要根据要复制的文件的大小来更改flShowProgess.
if FileSize(aFilename) > 500000 then
FCOPY.Flags.flShowProgress:=True else
FCOPY.Flags.flShowProgress:=False;
Run Code Online (Sandbox Code Playgroud)
显然不会编译.我做了一些搜索以找到一些例子,但我真的不知道我需要用来找到如何做到这一点的确切术语.
有人可以告诉我如何使用Flags打开flShowProgress仅适用于大于5M的文件,然后再关闭较小的文件吗?
谢谢.
我是否从根本上误解了 HasFlags 的工作原理?我不明白为什么这段代码失败了。
此代码采用一个值并确定它是否是我的枚举值的有效组合。
枚举值的两个子组通过对其他成员进行“或”运算来标识:JustTheMonths 和 Exclusives。JustTheMonths 在 Enum 中声明,Exclusives 在验证方法中构建。
当我将 1 或 2(未分配或未知)传递给此方法时,它会正确地将它们标识为有效 - 独占,但不是 JustTheMonths 的成员。
但是,当我将 4 传递给此代码时,它正确地将其识别为整个集合的成员,但错误地将其识别为子组 JustTheMonths 的成员。
我在这里做错了什么?为什么我的代码认为 4 是 (8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | 8172 | 16344) 的成员?
private void Form1_Load(object sender, EventArgs e)
{
FloweringMonth test = FloweringMonth.NotApplicable;
if (IsValidFloweringMonthValue((int)test))
{
System.Diagnostics.Debug.WriteLine("Valid");
}
else
{
System.Diagnostics.Debug.WriteLine("Not Valid");
}
}
[Flags]
public enum FloweringMonth
{
Unassigned = …Run Code Online (Sandbox Code Playgroud) 我试图了解下一次计算是如何执行的.
例如,如果这是我的终端命令
gcc ex2.c -D b+=2
Run Code Online (Sandbox Code Playgroud)
为什么我得到5?
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
2 b表示2*b?
~2 b意味着2*b然后〜?
假设有标志定义,例如:
SHF_WRITE 0x1
SHF_ALLOC 0x2
SHF_EXECINSTR 0x4
SHF_MASKPROC 0xf0000000
Run Code Online (Sandbox Code Playgroud)
给定一个标志,我需要输出SHF_WRITE|SHF_ALLOC比特0x1并0x2打开.
怎么用C做的伎俩?
使用 Python 设置多个文件属性的方法是什么?
例如,我想将文件的属性设置为系统、隐藏。
我可以使用类似下面的东西,但它只会设置一个属性,并覆盖之前的写入:
import win32con, win32api, os
filename = "some file name"
win32api.SetFileAttributes(filename,win32con.FILE_ATTRIBUTE_SYSTEM)
win32api.SetFileAttributes(filename,win32con.FILE_ATTRIBUTE_HIDDEN)
Run Code Online (Sandbox Code Playgroud)
这将最终只有 Hidden 属性。
你如何同时设置这两个属性?谢谢。
bitflags ×11
c ×4
enums ×3
c++ ×2
attributes ×1
bit-fields ×1
c# ×1
classname ×1
delphi ×1
gcc ×1
macros ×1
performance ×1
python ×1
rust ×1
type-systems ×1
validation ×1