是否有可能在没有任何枚举的情况下将所有可能的按位值形成为int?
场景是我需要从远程数据库中检索注释。数据库有一个固定的注释表,其中包含一个标识每个注释的MASK字段。
1 = "comment one"
2 = "comment two"
4 = "comment three"
8 = "comment four"
.
.
.
etc
然后在另一个表上,使用按位int引用所选的注释组合。可以通过Web界面在远程端添加或更改这些注释。我的客户端应用程序只需要撤回为给定记录选择的注释,因此我实际上需要将按位标志int反向工程为所有可能的整数。由于远程端的注释表是可更改的,我不能使用枚举。
所以任何人都可以告诉我,使用c#我如何将按位int逆向工程改为单个整数?
非常感谢您的帮助
答案 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
希望这有帮助。