标签: bitflags

VB6中的标志不返回正确的值

我目前正在尝试在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答案因为辅助函数,这似乎是提高代码可读性的好方法.

vb6 enums bitflags

7
推荐指数
1
解决办法
1541
查看次数

确定字节中的哪个单位已设置

我有一个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)

如何最有效地确定设定位的位置?我可以不经迭代地完成这项工作吗?

c optimization bit-manipulation bitflags

7
推荐指数
2
解决办法
3789
查看次数

在每个数据库引擎中存储二进制标志/布尔值的最佳方法是什么?

我已经看到了一些可能的方法(在一些数据库引擎中,其中一些是同义词):

  1. TINYINT(1)
  2. BOOL
  3. BIT(1)
  4. ENUM(0,1)
  5. CHAR(0)NULL

应该注意PHP支持的所有主要数据库引擎,但是作为参考,如果还注意到其他引擎,它将会更好.

我要求的设计最适合阅读.例如,在WHERE条件中使用flag字段进行SELECT,或者使用GROUP BY进行标记.性能比存储空间重要得多(除非大小对性能有影响).

还有一些细节:

在创建表时,我不知道它是否会稀疏(如果大多数标志都打开或关闭),但我可以稍后更改表,所以如果有什么我可以优化,如果我知道,它应该是指出.

此外,如果每行只有一个标志(或几个),那么与许多(或许多)标志相比,它会产生影响.

顺便说一句,我在以下的某处读过以下内容:

使用boolean可能与使用tinyint做同样的事情,但是它具有在语义上传达你的意图的优点,这是值得的.

好吧,在我的情况下它并不值得,因为每个表都由我的应用程序中的类表示,并且所有内容都在类中明确定义并且记录良好.

flags database-design bitflags

6
推荐指数
1
解决办法
2147
查看次数

这是最优化的方式吗?C位域

我创建了一个函数来设置或清除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)

c bitflags bit-fields

6
推荐指数
1
解决办法
581
查看次数

C - 使用枚举作为位标志 - 警告:枚举类型与另一种类型混合

我将枚举常量作为位标志传递给期望枚举类型作为输入的函数,如下所示:

// 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 …

c enums arm bitflags keil

6
推荐指数
0
解决办法
1098
查看次数

是否有使用base-2数字编码唯一选项列表的技术名称?

对这个问题相当模糊的性质表示道歉,我从来没有正式教过编程,谷歌对于像我这样的自助人来说是无用的,因为关键词很模糊.

我正在编写一些函数,将一个选项列表编码并解码为Long,以便它们可以轻松地在应用程序中传递,你知道这样的事情:

1 - Apple
2 - Orange
4 - Banana
8 - Plum

在这种情况下,数字11代表Apple,Orange和Plum.

我已经有了它的工作,但我看到这一直在使用,所以假设这个技术有一个共同的名称,毫无疑问,目前我所能达到的各种最佳实践和聪明的算法.

编辑:谢谢大家,我知道答案很快就会来:)

algorithm options bitmask bitflags

5
推荐指数
1
解决办法
201
查看次数

C#中是否有模式或方法来检查(int 1,2,4,8,...)选项是真还是假

我喜欢写枚举或整数来传递我的方法选项.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)

c# enums bitflags boolean-operations

5
推荐指数
1
解决办法
655
查看次数

iOS中flags结构的目的是什么?

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. 这个结构的目的是什么?
  2. 什么是:1在每行的结束符号意味着什么?
  3. unsigned当没有显式类型时,修饰符的含义是什么?

谢谢

c struct bitflags ios

5
推荐指数
1
解决办法
412
查看次数

如何匹配Rust中的标志/位掩码?

对典型的位标志进行检查:

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陈述书写?

bitflags rust

5
推荐指数
1
解决办法
1120
查看次数

Rust位域和枚举C++风格

我是一个来自C/C++的Rust初学者.首先,我尝试使用user32.MessageBox为Microsoft Windows创建一个简单的"Hello-World"程序,我偶然发现了与bitfields相关的问题.免责声明:所有代码段都是在SO编辑器中编写的,可能包含错误.

消息框中的"Hello-World"

调用该函数的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)

c++ winapi bitflags rust bit-fields

5
推荐指数
1
解决办法
406
查看次数