2017-04-11 10 views
2

그래서 디버거를 살펴보면 1 비트가 특정 값으로 설정되어 있는지 확인해야합니다.C++ 메모리에서 1 비트 읽기?

예를 들어이 메모리 주소에 0x12345이이 네 바이트를 보유한다고 가정하면 01008100, 정확히 8이 정확한 지점에 있는지 확인하는 방법은 무엇입니까? 죄송합니다. 저는 사용할 단어가 부족하여 실제로 설명하는 방법조차 모릅니다. 그러나 예를 들어 8

if(*(char*)(0x12345 + 0x2) == 8) 
{ 
    //ok 
} 

뭔가를 시도하는 것입니다 내 첫번째 추측 위에 게시 된 그 바이트가 정확한 위치에 바로이 있다면 나는 확인하고 싶어하지만 읽기 때문에이 obivously 작동하지 않을 경우 값이 0x81 인 경우, 8이 있고 그 앞이나 뒤에있는 다른 모든 비트는 무시해야합니다. 바라건대이 질문은 최소한 누군가가 내 질문을 이해할 수있는 방식으로 말했습니다. 독서에 감사드립니다. 좋은 하루 되세요.

+0

'8'은이 경우 1 비트가 아니며 바이트의 16 진수 표현의 한 숫자입니다. – Drax

답변

0

비트 AND (&)를 사용하여 개별 비트를 테스트 할 수 있습니다 (예 : AND 연산 마스크 밖으로 비트는, 예를 들어,에 관심이없는 것을

if ((*(char*)(0x12345 + 0x2) & 0x80) == 0x80) 
{ 
    //ok 
} 

0x12345 + 0x2: 10000001 ; 0x81 

AND with 0x80: 10000000 ; 0x80 
+0

은'& 0x80이어야 함) == 0x80' – Matthias247

+0

@ Matthias247 : 고마워 - 고정. –

0

4 바이트 값의 특정 비트가 설정되어 있는지 확인하고 싶습니다.

당신은 바이트 스트림에 비트를 확인하려는 가정이 아닌 32 비트 값에, 나는 당신이 지정한 것과 비슷한을 사용합니다,하지만 난 비트 및 연산자를 사용합니다 :

if((*(std::uint8_t*)(0x12345 + 0x2) & 0x80) != 0) 
{ 
    // the bit is set 
} 

uint32 값의 비트를 확인하려는 경우 작업중인 컴퓨터의 엔디안을 고려해야합니다 (상위 또는 하위 비트 엔디안).

올바른 데이터 형식을 지정하면 컴퓨터가 자동으로 처리합니다.

// Note: 0x12345 is a fictional address, not properly aligned on some architectures 
if((*(std::uint32_t*)0x12345 & 0x00008000) != 0) 
{ 
    // the bit is set 
} 
+1

@ Raul R : 의견에 감사드립니다. 더 눈에 잘 띄도록 댓글을 옮겼습니다. –