2017-12-20 35 views
-1

ファイル属性を設定して間違っている古いコードが見つかりました。それはこのように見える -BOOLEAN代数NOTとDWORDs - 修正を提案する

flag1 = 0x0001; 
flag2 = 0x0002; 

DWORD flags = flag1 | flag2; 

//great - flags is 3 

DWORD prevValue = 0x0010; //say 

//add our new flags to prevValue 
DWORD newVal = prevValue | flags; 

//newVal is 19 

//but now I want to remove those flags from newVal 

DWORD backToPrev = newVal & !flags; 

//but according to my compiler (vs2012) 
//!flags is 0, it can't do the logical NOT on the DWORD 

ASSERT (backToPrev); // it's 0, should be 16 

修正のための提案はありますか?

+0

'〜'ビット単位ではありません。 –

答えて

1

!演算子は論理NOTです。この演算子の結果は何がしたいことは、ビット単位で0または1であるNOT演算子~

DWORD backToPrev = newVal & ~flags; 
0
あなたが使用することができます

|フラグを指定する場合は| =、フラグを削除する場合は〜を使用します。あなたがこれを行う場合は

#include <Windows.h> 
#include <iostream> 
using namespace std; 

DWORD UpdateFlags(
    DWORD CurrentFlags, 
    DWORD RemoveFlag 
) 
{ 
    return CurrentFlags & ~RemoveFlag; 
} 

int main() 
{ 
    DWORD MyFlags = PROCESS_VM_OPERATION | PROCESS_VM_READ; 

    MyFlags = UpdateFlags(MyFlags, 
     PROCESS_VM_READ); 

    getchar(); 
    return 0; 
} 

、あなたは簡単に〜&を使用して維持することなく、フラグを更新することができます。読みやすくするためにはるかに簡単です。上記の例では、MyFlagsにPROCESS_VM_OPERATIONとPROCESS_VM_READフラグが割り当てられています(私にとって合計値は24です).PROCESS_VM_READを削除するフラグを更新した後、PROCESS_VM_READを削除したため、PROCESS_VM_OPERATIONのみが残っていたため、

は、フラグの有無を確認するには、次の

BOOL IsFlagPresent(
    DWORD CurrentFlags, 
    DWORD TargetFlag 
) 
{ 
    return ((CurrentFlags & TargetFlag) == TargetFlag) ? 
     TRUE : FALSE; 
} 
関連する問題