[英]How do I check for presence of a bit in C# using AND?
如何使用邏輯運算符確定是否設置了位,或者移位是唯一方法?
我發現這個問題 ,使用位移,但我認為我可以AND
我的價值。
對於某些情況,我正在從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
是一個object{int}
,值是0x00000010
。 isFlag_Schema_Base_Object
,是0x02
resFlag
是0x00000010
,十進制為16,二進制為10000
。 因此,盡管您的注釋說“如果設置了第10位”,您似乎還是想測試第4位(第0位是最低有效位)。
如果確實需要測試位4,則需要將isFlag_Schema_Base_Object
初始化為16,即0x10
。
無論如何,你是對的-你不需要做比特移位,看是否有位被設置,你可以AND
使用具有只是位設置一個恆定值,看看結果是非零。
如果該位置1:
original xxx1xxxx
AND
isFlag_Schema_Base_Object 00010000
-----------------------------------
= 00010000 (non-zero)
但是,如果未設置位:
original xxx0xxxx
AND
isFlag_Schema_Base_Object 00010000
-----------------------------------
= 00000000 (zero)
話雖如此,使用值1<<4
初始化isFlag_Schema_Base_Object
可能更清楚,以明確表明您正在測試是否設置了位4。
如果您知道要檢查的位並且正在處理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];
使用移位比使用CreateMask可能更干凈。 但它在那里:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.