2017-12-20 19 views
-1

파일 속성을 설정하면서 잘못된 코드가 있음을 발견했습니다. 모양은 다음과 같습니다. -부울 대수 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_READ를 삭제하기 때문에 PROCESS_VM_READ를 제거하기 위해 플래그를 업데이트 한 후 PROCESS_VM_READ 플래그와 PROCESS_VM_READ 플래그를 할당합니다 (따라서 24 개의 총 값). PROCESS_VM_READ를 제거하고 PROCESS_VM_OPERATION 만 남았 기 때문에 값이 8이됩니다.

는 플래그의 존재를 확인하려면 :

BOOL IsFlagPresent(
    DWORD CurrentFlags, 
    DWORD TargetFlag 
) 
{ 
    return ((CurrentFlags & TargetFlag) == TargetFlag) ? 
     TRUE : FALSE; 
}