2013-08-02 2 views
2

64 비트를 조작하려고합니다. 나는 다음과 같은 프로그램64 비트를 조작하는 방법은 무엇입니까?

#include <iostream> 

using namespace std; 

int main() 
{ 
unsigned long long x = 1; 
int cnt = 0; 
for(int i =0 ;i<64;++i) 
{ 
    if((1<<i)&x) 
    ++cnt; 
} 
cout<<cnt; 
} 

를 실행 한 porcess을 테스트 int.To 오래 오래 부호에 저장할 수를 사용하지만 탄소 나노 튜브의 출력은 분명히 잘못이다 2입니다. 어떻게하면 64 비트를 조작 할 수 있습니까? 수정은 어디 있습니까? 사실 저는 2^63보다 적은 수의 이진 표현으로 1의 수인 패리티를 찾으려고합니다.

답변

4

같은 조건을 쓸 수 있습니다 때 당신이 당신의 변수 x의 모든 비트를 테스트하려고하기 때문에 귀하의 x는 최대 값을 포함해야

int main() 
{ 
unsigned long long x = 0xFFFFFFFFFFFFFFFF; 
int cnt = 0; 
for(int i =0 ;i<64;++i) 
{ 
    if((1<<i)&x) 
    ++cnt; 
} 
cout<<cnt; 
} 
+4

또는 단순히 '1LLU'. – Shahbaz

+0

예, 맞습니다. 더 간단하고 읽기 쉽습니다. –

+0

더 나은 점 : 'uint64_t'에 대한 캐스트를 사용합니다. 실제로는 정확히 64 비트가 보장됩니다. 'unsigned long long'은 16 비트 또는 32 비트를 포함하여 8 비트보다 큰 값일 수 있습니다. – cmaster

0

귀하의 경우에 조작이 의미하는 것은 무엇입니까? 변수 x의 모든 비트를 테스트 할 것입니다. 그것의 내용은 i 큰 32 이상의

당신이 (x >> i) & 1

+0

실제로 패리티를 찾으려고합니다. 즉, 뉴 2^63보다 작은 수의 이진수 표현으로 1의 정수. –

2

(1<<i) 오버플로 64 비트를 사용하려면 64 비트 1을 사용해야합니다. 따라서 다음을 시도하십시오.

if(((unsigned long long) 1<<i)&x) 
관련 문제