2009-11-23 4 views
0

Why I cannot derive from long?롱 타입, 왼쪽 시프트 및 오른쪽 시프트 작업

내가 흥미로운 문제를 발견 내 앞의 질문을 계속.

단계 :

4294967296 & 0xFFFFFFFF00000000 

결과 : 4294967296.

2 단계.

4294967296 & 0x00000000FFFFFFFF 

결과 : 4294967295 실패 : 0

아하, 그래서 나는 여기 4,294,967,296 == 0xFFFFFFFF를

이의이

(long)0x00000000FFFFFFFF 

결과를 확인 해보자 있다고 가정합니다.

하자 한 번 확인

4294967296 >> 32 

결과 : 1. 실패.

내가 사용하기 때문에 유일한 설명은 일부 비트가 기호로 예약되어 있습니다. C에서는 unsigned long을 사용할 것입니다. 당신은 어떻게 생각하십니까?

+1

... 6과 같이 보이는 숫자는 십진수로 같을 수 없습니다. .. 16 진수. 하나는 고르고 하나는 이상합니다! – AakashM

답변

5
4294967296 & 0xFFFFFFFF00000000 = 4294967296 

이는 4294967296 값이 하위 32 비트에 설정된 비트가 없음을 나타냅니다. 사실, 4294967296은 0x100000000이므로이 사실이 맞습니다.

4294967296 >> 32 = 1 

다시 말하지만,

즉, 4294967296이 0xFFFFFFFF라는 결론은 잘못되어 나머지 체크는이를 지원하지 않습니다.

+0

나에게 수치. 감사.하지만이 결론에 도달했습니다 작동하지 않는 다음 코드를 디버깅하십시오. long a = 2; long b = 3; long packed = a + b << 32; // 이제 포장을 풀어 보겠습니다. 긴 a1 = 묶음 및 0xFFFFFFFF; 긴 b1 = 묶음 >> 32; 결과 : a1 = 0; b1 = 5; 어디서 오류가 있습니까? 정말 간단한 실수 야. –

+0

죄송합니다. 서식에서 설명이 작동하지 않습니다. –

+2

문제는 운영상의 문제입니다. Plus는 비트 이동 전에 처리됩니다. "long packed = a + (b << 32);"를 시도하십시오. – fyjham

1

나는 비트 단위로 and 연산을 이해하지 못하고 있다고 생각합니다. 비트 and은 양쪽 모두에 설정된 비트를 리턴합니다. 두 사람은 같은라면 다음

(4294967296 & 0xFFFFFFFF00000000) == 4294967296 

(4294967296 & 0xFFFFFFFF00000000) == 0xFFFFFFFF00000000 

은 모두 잡아 것입니다,하지만 그들은 분명하지 않습니다.

3

음 ... 왜 당신이 결론에 도달했는지 모르겠지만 4294967296은 0x100000000입니다. 쉽게 읽을 수있는 16 진수로 비트 AND를 작성하려면 ...

0x0000000100000000 & 
0x00000000FFFFFFFF = 
0x0000000000000000 

0x0000000100000000 & 
0xFFFFFFFF00000000 = 
0x0000000100000000 

두 가지 모두 완벽합니다. 아마도 당신은 비트 AND를 오해하고 있습니다 ... 그것은 두 비트가 같은 비트를 매핑합니다. 귀하의 의견은 bitwise XOR보다 비트 AND (사용중인 작업이 아닌)보다 적합합니다 ...