我目前正在尝试在VB6/COM项目中使用一个标志枚举.但是,当尝试从枚举中读取值时,我得到的结果不一致.
这是枚举定义:
Enum Fruits
None = 0
Apple = 1
Strawberry = 2
Lemon = 4
End Enum
Run Code Online (Sandbox Code Playgroud)
我有一个暴露属于Fruits类型属性的对象
Public Get AvailableFruits as Fruits
Run Code Online (Sandbox Code Playgroud)
应该能够读取该值的代码用于显示/隐藏标签,具体取决于枚举的每个位的值:
lblAppleAvailable.Visible = basket.AvailableFruits And Fruits.Apple
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时basket.AvailableFruits = 0,我得到True作为结果.
有什么可能导致这种行为的想法吗?
编辑:
我尝试过枚举的不同值:
basket.AvailableFruits = 0
basket.AvailableFruits And Apple // Returns True
basket.AvailableFruits And Strawberry // Returns True
basket.AvailableFruits And Lemon // Returns False
Run Code Online (Sandbox Code Playgroud)
作为副节点,在调试代码时,如果我将表达式放在监视表达式中,我会得到正确的值; 但是当我的代码中计算表达式时,它仍然返回True.
我尝试使用不同的检查语法:
(basket.AvailableFruits And Fruits.Apple) = Fruits.Apple
Run Code Online (Sandbox Code Playgroud)
仍然是真的时候basket.AvailableFruits = 0:-(
解
在测试了不同的解决方案之后,我已经能够将问题缩小到COM组件.此组件的原始编码器将指针设置为0而不是将0作为值返回,这在尝试读取值时导致问题.
我选择了FlipScript答案因为辅助函数,这似乎是提高代码可读性的好方法.
我有一个byte我用于比特标志.我知道在任何给定时间都设置了一个且只有一个位byte.
例如: unsigned char b = 0x20; //(00100000) 6th most bit set
我目前使用以下循环来确定设置了哪个位:
int getSetBitLocation(unsigned char b) {
int i=0;
while( !((b >> i++) & 0x01) ) { ; }
return i;
}
Run Code Online (Sandbox Code Playgroud)
如何最有效地确定设定位的位置?我可以不经迭代地完成这项工作吗?
我已经看到了一些可能的方法(在一些数据库引擎中,其中一些是同义词):
应该注意PHP支持的所有主要数据库引擎,但是作为参考,如果还注意到其他引擎,它将会更好.
我要求的设计最适合阅读.例如,在WHERE条件中使用flag字段进行SELECT,或者使用GROUP BY进行标记.性能比存储空间重要得多(除非大小对性能有影响).
还有一些细节:
在创建表时,我不知道它是否会稀疏(如果大多数标志都打开或关闭),但我可以稍后更改表,所以如果有什么我可以优化,如果我知道,它应该是指出.
此外,如果每行只有一个标志(或几个),那么与许多(或许多)标志相比,它会产生影响.
顺便说一句,我在以下的某处读过以下内容:
使用boolean可能与使用tinyint做同样的事情,但是它具有在语义上传达你的意图的优点,这是值得的.
好吧,在我的情况下它并不值得,因为每个表都由我的应用程序中的类表示,并且所有内容都在类中明确定义并且记录良好.
我创建了一个函数来设置或清除DWORD中的特定位数.我的功能有效.我不需要帮助使它工作.但是,我想知道我选择的方法是否是最快的方法.
我很难解释这是如何工作的.有两个包含DWORD的数组,这些数组在DWORD的左侧和右侧填充了位(所有二进制1都是).除了我想要设置或清除的位之外,它创建一个填充了所有位的掩码,然后根据该掩码使用按位运算符设置它们.这样一个简单的任务似乎相当复杂,但它似乎是我想出的最快的方式.它比逐点设置要快得多.
static DWORD __dwFilledBitsRight[] = {
0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
};
static DWORD __dwFilledBitsLeft[] = {
0x0, 0x80000000, 0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000, 0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000, 0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0,
0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF
}; …Run Code Online (Sandbox Code Playgroud) 我将枚举常量作为位标志传递给期望枚举类型作为输入的函数,如下所示:
// Enumeration type
typedef enum
{
LED_RED = (1 << 0),
LED_GREEN = (1 << 1),
LED_YELLOW = (1 << 2),
LED_ORANGE = (1 << 3),
} LedType;
...
// Function declaration
void setOnLed(LedType led);
...
// Function call
setOnLed(LED_RED | LED_GREEN | LED_YELLOW);
Run Code Online (Sandbox Code Playgroud)
当我调用该函数时,我收到一条警告:
警告:#188-D:枚举类型与另一种类型混合
警告是因为LED_RED | LED_GREEN | LED_YELLOW转换为整数而不是LedType.
我可以通过在LedType枚举中添加 LED 组合来避免警告,但这意味着我必须添加所有可能的组合……如果我向 中添加更多 LED 选项enum,它会变得非常混乱……
我可以使用数组作为函数的输入,但是在调用函数时需要更多的代码,我更喜欢简单的函数调用来设置 LED。
我正在使用 Keil µVision IDE 对基于 ARM 的微控制器 (STM32) 进行编程。
是否有一种简单安全的方法来避免此警告或另一种方法将所有 LED …
对这个问题相当模糊的性质表示道歉,我从来没有正式教过编程,谷歌对于像我这样的自助人来说是无用的,因为关键词很模糊.
我正在编写一些函数,将一个选项列表编码并解码为Long,以便它们可以轻松地在应用程序中传递,你知道这样的事情:
1 - Apple
2 - Orange
4 - Banana
8 - Plum
等在这种情况下,数字11代表Apple,Orange和Plum.
我已经有了它的工作,但我看到这一直在使用,所以假设这个技术有一个共同的名称,毫无疑问,目前我所能达到的各种最佳实践和聪明的算法.
编辑:谢谢大家,我知道答案很快就会来:)
我喜欢写枚举或整数来传递我的方法选项.C#中是否有模式或方法来检查(int 1,2,4,8,...)选项是真还是假.我认为应该可以通过二进制函数轻松实现.
class Program
{
public enum Option
{
Option_A = 1,
Option_B = 2,
Option_C = 4,
Option_D = 8,
}
static void Main(string[] args)
{
int activeOption = 5; // Means I activeted the Option_A and Option_C
if (IsOption(activeOption, Option.Option_A)) { /*do work*/ }
if (IsOption(activeOption, Option.Option_B)) { /*do work*/ }
if (IsOption(activeOption, Option.Option_C)) { /*do work*/ }
if (IsOption(activeOption, Option.Option_D)) { /*do work*/ }
}
private static bool IsOption(int activeOption, Option option)
{
/*Evaluate if IsOption is …Run Code Online (Sandbox Code Playgroud) struct
{
unsigned resizesCellWidths:1;
unsigned numColumns:6;
unsigned separatorStyle:3;
unsigned allowsSelection:1;
unsigned backgroundViewExtendsUp:1;
unsigned backgroundViewExtendsDown:1;
unsigned usesPagedHorizontalScrolling:1;
unsigned updating:1;
unsigned ignoreTouchSelect:1;
unsigned needsReload:1;
unsigned allCellsNeedLayout:1;
unsigned isRotating:1;
unsigned clipsContentWidthToBounds:1;
unsigned isAnimatingUpdates:1;
unsigned requiresSelection:1;
unsigned contentSizeFillsBounds:1;
unsigned delegateWillDisplayCell:1;
unsigned delegateWillSelectItem:1;
unsigned delegateWillSelectItemMultiTouch:1;
unsigned delegateWillDeselectItem:1;
unsigned delegateDidSelectItem:1;
unsigned delegateDidSelectItemMultiTouch:1;
unsigned delegateDidDeselectItem:1;
unsigned delegateGestureRecognizerActivated:1;
unsigned delegateAdjustGridCellFrame:1;
unsigned delegateDidEndUpdateAnimation:1;
unsigned dataSourceGridCellSize:1;
unsigned int isEditing:1;
unsigned __RESERVED__:1;
} _flags;
Run Code Online (Sandbox Code Playgroud)
:1在每行的结束符号意味着什么?unsigned当没有显式类型时,修饰符的含义是什么?谢谢
对典型的位标志进行检查:
if (v & (1 << 0)) != 0 { foo(); }
else if (v & (1 << 1)) != 0 { bar(); }
else if (v & (1 << 2)) != 0 { baz(); }
Run Code Online (Sandbox Code Playgroud)
如何将其作为match陈述书写?
我是一个来自C/C++的Rust初学者.首先,我尝试使用user32.MessageBox为Microsoft Windows创建一个简单的"Hello-World"程序,我偶然发现了与bitfields相关的问题.免责声明:所有代码段都是在SO编辑器中编写的,可能包含错误.
调用该函数的UTF-16LE版本所需的合并C声明是:
enum MessageBoxResult {
IDFAILED,
IDOK,
IDCANCEL,
IDABORT,
IDRETRY,
IDIGNORE,
IDYES,
IDNO,
IDTRYAGAIN = 10,
IDCONTINUE
};
enum MessageBoxType {
// Normal enumeration values.
MB_OK,
MB_OKCANCEL,
MB_ABORTRETRYIGNORE,
MB_YESNOCANCEL,
MB_YESNO,
MB_RETRYCANCEL,
MB_CANCELTRYCONTINUE,
MB_ICONERROR = 0x10UL,
MB_ICONQUESTION = 0x20UL,
MB_ICONEXCLAMATION = 0x30UL,
MB_ICONINFORMATION = 0x40UL,
MB_DEFBUTTON1 = 0x000UL,
MB_DEFBUTTON2 = 0x100UL,
MB_DEFBUTTON3 = 0x200UL,
MB_DEFBUTTON4 = 0x300UL,
MB_APPLMODAL = 0x0000UL,
MB_SYSTEMMODAL = 0x1000UL,
MB_TASKMODAL = 0x2000UL,
// Flag values.
MB_HELP = 1UL << 14,
MB_SETFOREGROUND = …Run Code Online (Sandbox Code Playgroud)