2012-02-19 1 views
0

빠른 질문이 있습니다.C++ Int 비트 조작은 2UL = 10UL입니까?

저는 C/C++에서 약간의 조작으로 잠시 놀았으며, 최근에 2UL과 10UL을 일반 서명되지 않은 int와 비교하면 같은 비트를 반환하는 것으로 나타났습니다. 예를 들어

,

#define JUMP 2UL 
#define FALL 10UL 

unsigned int flags = 0UL; 
this->flags |= FALL; 

//this returns true 
this->is(JUMP); 

bool Player::is(const unsigned long &isThis) 
{ 
return ((this->flags & isThis) == isThis); 
} 

2U는 10U와 동일한 경우 확인하고하시기 바랍니다

그렇다면, 어떻게 하나의 부호없는 정수에 8 개 이상의 (?) 플래그가 필요하면 내가 주위 갈 것입니다.

종류에 관해서, 물론

-Markus

답변

5

. 10ul은 2 진수로 1010이고 2는 10입니다. 따라서 x |= 10을 수행하면 두 번째 비트도 설정됩니다.

플래그로 0x100x2을 사용하고 싶을 것입니다. 이것은 예상대로 작동합니다. 제쳐두고

: 육각 표기 한 자리는 4 비트가 아닌 제

+0

아, 이제 알겠습니다. 감사! – Orujimaru

+0

그래서 내가 원하는 것은 1,2,4,8,16 등입니다. 내가 할 수있는 것은 1UL, 2^1UL, 2^2UL, 2^3UL입니다. 그러나 예상대로 작동하지 않습니다. 512UL, 1024UL 등보다이 값을 정의하는 더 좋은 방법이 있습니까? – Orujimaru

+0

@Orujimaru :'1UL << k' 어쩌면? – Fanael

1
JUMP, 2: 0010 
FALL, 10: 1010 

FALL & JUMP = JUMP = 0010 
를 나타내는
1

하면 비트 - 그들 (2 & 10) 경우 10 1010 이진 소수점 반면 0010 이진 소수점 2 따라서 이진수 0010 또는 십진수 2가됩니다. 따라서 10 & 2은 실제로 2와 같습니다. 1ul << 21ul << 10에 대한 테스트가 의도적인데, 비트 2와 10이 각각 있습니다. 또는 0x10으로 표시되는 16 진수 10 (10 진수 16, 2 진수 10000)을 사용하려고했는지 여부입니다.

+0

감사합니다. 그래서 1UL << 10은 0x10과 같지 않습니까? – Orujimaru

+0

아니요, 전혀 아닙니다. 1u << 1u는 2 (0000 0000 00010, 0x2), 1u << 2u는 4 (0000 0000 0100, 0x4), 1u << 0u는 1 (이진 0000 0000 0001, 16 진수 0x1) 등등. 따라서, 1u << 10u는 1024 (0100 0000 0000, 0x400)이다. – pmdj