如何检查C#使用和时是否存在位?
如何使用逻辑运算符确定是否设置了位,或者位移位是唯一的方法 我发现它使用了位移位,但我认为我可以如何检查C#使用和时是否存在位?,c#,active-directory,byte,boolean-logic,C#,Active Directory,Byte,Boolean Logic,如何使用逻辑运算符确定是否设置了位,或者位移位是唯一的方法 我发现它使用了位移位,但我认为我可以和计算出我的值 对于某些上下文,我正在从Active Directory读取一个值,并试图确定它是否是架构基对象。我认为我的问题是语法问题,但我不知道如何纠正它 foreach (DirectoryEntry schemaObjectToTest in objSchema.Children) { var resFlag = schemaObjectToTest.
和计算出我的值
对于某些上下文,我正在从Active Directory读取一个值,并试图确定它是否是架构基对象。我认为我的问题是语法问题,但我不知道如何纠正它
foreach (DirectoryEntry schemaObjectToTest in objSchema.Children)
{
var resFlag = schemaObjectToTest.Properties["systemFlags"].Value;
//if bit 10 is set then can't be made confidential.
if (resFlag != null)
{
byte original = Convert.ToByte( resFlag );
byte isFlag_Schema_Base_Object = Convert.ToByte( 2);
var result = original & isFlag_Schema_Base_Object;
if ((result) > 0)
{
//A non zero result indicates that the bit was found
}
}
}
当我查看调试器时:
resFlag
是一个对象{int}
,其值为0x00000010
。
isFlag\u Schema\u Base\u Object
是0x02
resFlag
是0x00000010
,十进制为16,二进制为10000
。因此,似乎您想要测试位4(位0是最低有效位),尽管您的注释说“如果设置了位10”
如果确实需要测试位4,则需要将isFlag\u Schema\u Base\u Object
初始化为16,即0x10
无论如何,您是对的-您不需要进行位移位来查看是否设置了位,您可以和使用刚刚设置了该位的常量的值,并查看结果是否为非零
如果设置了位:
original xxx1xxxx
AND
isFlag_Schema_Base_Object 00010000
-----------------------------------
= 00010000 (non-zero)
但如果未设置位:
original xxx0xxxx
AND
isFlag_Schema_Base_Object 00010000
-----------------------------------
= 00000000 (zero)
话虽如此,如果您知道要检查哪个位,并且您正在处理可以使用的int,那么使用值1初始化isFlag\u Schema\u Base\u Object
可能会更清楚
使用位移位可能比使用CreateMask更干净。但它就在那里:)只是为了澄清一下,如果resflag为:0x0001010,我的和是否会非零?这就是我的目标。是的-只要isFlag\u Schema\u Base\u Object
本身只设置了一个位,那么和将其与original
进行比较就会得到零(如果设置了位),或者isFlag\u Schema\u Base\u Object
(非零,意味着设置了位)。您可以测试结果是零/非零,还是等于/不等于isFlag\u Schema\u Base\u Object
。这些测试是等效的。如果你有任何疑问,试试看:-)@MakerOfThings7:是的。AND将导致其他位为0,但要检查的位为1(如果且仅当要检查的位已设置)。
int yourValue = 5;
BitVector32 bv = new BitVector32(yourValue);
int bitPositionToCheck = 3;
int mask = Enumerable.Range(0, bitPositionToCheck).Select(BitVector32.CreateMask).Last();
bool isSet = bv[mask];