如何使用逻辑运算符来确定某个位是否已设置,或者是唯一的位移位?
我发现这个question使用了位移,但我认为我只能AND
我的价值。
对于某些上下文,我正在从Active Directory读取值并尝试确定它是否为Schema Base Object。我认为我的问题是语法问题,但我不确定如何纠正它。
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
是object{int}
,值为0x00000010
。
isFlag_Schema_Base_Object
,0x02
答案 0 :(得分:7)
resFlag
是0x00000010
,十进制为16,二进制为10000
。所以看起来你想测试第4位(第0位是最低有效位),尽管你的评论说“如果设置了第10位”。
如果确实需要测试第4位,则isFlag_Schema_Base_Object
需要初始化为16,即0x10
。
无论如何,你是对的 - 你不需要进行位移动以查看是否设置了一个位,你可以AND
使用只有该位设置的常量来计算值,并查看结果是非零。
如果设置了该位:
original xxx1xxxx
AND
isFlag_Schema_Base_Object 00010000
-----------------------------------
= 00010000 (non-zero)
但如果未设置该位:
original xxx0xxxx
AND
isFlag_Schema_Base_Object 00010000
-----------------------------------
= 00000000 (zero)
话虽如此,使用值isFlag_Schema_Base_Object
初始化1<<4
可能会更清楚,以明确您正在测试是否设置了第4位。
答案 1 :(得分:0)
如果您知道要检查哪个位并且正在处理int,则可以使用BitVector32。
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];
使用bitshifting可能比使用CreateMask更清晰。但它在那里:)