如何在没有任何枚举的情况下将int转换为其对应的按位标志集

时间:2014-03-19 17:22:49

标签: c#

是否有可能在没有任何枚举的情况下将所有可能的按位值形成为int?

场景是我需要从远程数据库中检索注释。数据库有一个固定的注释表,其中包含一个标识每个注释的MASK字段。

1 = "comment one"
2 = "comment two"
4 = "comment three"
8 = "comment four"
.
.
.
etc

然后在另一个表上,使用按位int引用所选的注释组合。可以通过Web界面在远程端添加或更改这些注释。我的客户端应用程序只需要撤回为给定记录选择的注释,因此我实际上需要将按位标志int反向工程为所有可能的整数。由于远程端的注释表是可更改的,我不能使用枚举。

所以任何人都可以告诉我,使用c#我如何将按位int逆向工程改为单个整数?

非常感谢您的帮助

4 个答案:

答案 0 :(得分:2)

按位and&)和or|)是您要查找的操作。即取对应于8的位:

 var commentForFlag = value & 8;

请注意,枚举或命名常量可能会使代码更具可读性,如value & CommentMask.Forth

您可能要寻找的另一件事是位移<<

for (var commentIndex = 0; commentIndex < 32; commentIndex)
{
   var isThere = (value & (1 << commentIndex)) != 0;
   Console.WriteLine("Comment {0} is present = {1}", commentIndex, isThere);
}

答案 1 :(得分:1)

我想我在这里做点什么

    private static IEnumerable<int> GetValues(int maskValue)
    {                        
        int max = 131072;

        for (int i = max; i > 0; i/=2)
        {
            int x = i & maskValue;
            if (x > 0)
            {
                yield return x;
            }
        }
    }

答案 2 :(得分:0)

使用& or | operators

两个int值187和32的样本。

  10111011  =  187
  00100000  =  32
  AND
  00100000  =  32

我们可以这样做

int a = 187, b = 32;
int result = a & b;

答案 3 :(得分:0)

正如上面提到的其他人所提到的,您将使用逐位运算符(&|)来确定为给定整数值设置的位。以下是如何使用它们的示例:

namespace Playground2014.ConsoleStuff
{
    using System;

    internal static class Program
    {
        static void Main()
        {
            const int MaskForCommentOne = 1;
            const int MaskForCommentTwo = 2;
            const int MaskForCommentThree = 4;
            const int MaskForCommentFour = 8;
            const int MaskForCommentFive = 16;
            const int MaskForCommentSix = 32;
            const int MaskForCommentSeven = 64;
            const int MaskForCommentEight = 128;

            int myCommentNumber = 72;
            Console.WriteLine("My input number is: {0}", myCommentNumber);
            if(MaskForCommentOne == (myCommentNumber & MaskForCommentOne))
            {
                Console.WriteLine("Comment One");
            }

            if(MaskForCommentTwo == (myCommentNumber & MaskForCommentTwo))
            {
                Console.WriteLine("Comment Two");
            }

            if(MaskForCommentThree == (myCommentNumber & MaskForCommentThree))
            {
                Console.WriteLine("Comment Three");
            }

            if(MaskForCommentFour == (myCommentNumber & MaskForCommentFour))
            {
                Console.WriteLine("Comment Four");
            }

            if(MaskForCommentFive == (myCommentNumber & MaskForCommentFive))
            {
                Console.WriteLine("Comment Five");
            }

            if(MaskForCommentSix == (myCommentNumber & MaskForCommentSix))
            {
                Console.WriteLine("Comment Six");
            }

            if(MaskForCommentSeven == (myCommentNumber & MaskForCommentSeven))
            {
                Console.WriteLine("Comment Seven");
            }

            if(MaskForCommentEight == (myCommentNumber & MaskForCommentEight))
            {
                Console.WriteLine("Comment Eight");
            }
        }
    }
}

输出应如下:

My input number is: 72
Comment Four
Comment Seven

希望这有帮助。