2014-01-20 5 views
1

64 비트 Mac OS X을 사용하고 있습니다. NSUInteger (또는 uint64, 시스템에서는 문제가되지 않습니다)가 있습니다.64 비트 정수에서 상위 20 비트를 얻는 방법은 무엇입니까?

NSUInteger의 상위 20 비트를 가져 와서 다른 NSUInteger에 저장하는 방법은 무엇입니까?

C, C++ 또는 Objective-C에서이를 수행하는 방법에 대한 답을 얻을 수 있습니다.

P. 제발, 모든 코드를 수정하고 비트 필드를 대신 사용하라고 말하지 마십시오.

P.P.S. 비트 마스크와 이동을 사용해야 할 것 같아요?

+10

은 단순히'내가에게 >> 싶지 않아 44' ? 또는 NSUInteger가 64보다 클 수 있다면'(i >> 44) & 0xFFFFF'가됩니다. – ikegami

+0

예, 확실합니다. 고맙습니다. –

답변

3

uint64_t를 들어, 당신은 단순히 64 비트보다, 당신은 또한 더 높은 비트를 멀리 마스크해야합니다 클 수 있습니다 서명 유형 또는 유형의

i >> 44 

를 사용할 수 있습니다.

(i >> 44) & 0xFFFFF 

작은 규모의 예를 ,

4 bits starting at pos 2 of 8. 

    7 6 5 4 3 2 1 0 
+---+---+---+---+---+---+---+---+ 
| ? | ? |  j  | ? | ? | 
+---+---+---+---+---+---+---+---+ 

          >> 2 

+---+---+---+---+---+---+---+---+ 
| * | * | ? | ? |  j  | * = 0 if unsigned or original bit7 if signed. 
+---+---+---+---+---+---+---+---+ 

        & (2**4 - 1) 

+---+---+---+---+---+---+---+---+ 
| 0 | 0 | 0 | 0 |  j  | 
+---+---+---+---+---+---+---+---+ 
+0

+1 - 멋진 ASCII 아트웍으로 비트 조작이 그림 형식임을 보여줍니다. –

0
uint64 original = ...; 
uint64 another = ((0xFFFFF00000000000 & original) >> 44); 

먼저 비트 마스크를 사용하여 오른쪽으로 44 비트 이동합니다.

+0

처음으로 이동 한 다음 마스크를 적용하면 상수를 입력하는 실수가 줄어 듭니다. – Ferruccio

+0

먼저 마스킹은 서명 된 유형에서도 실패합니다. – ikegami

0

나는 서명 숫자 먼저 이동에 문제가 인식되지 않았습니다. 이것이 구현에 종속적 인 기능입니까?

int main() 
{ 
    uint64_t a = std::numeric_limits<uint64_t>::max(); 
    int64_t b = std::numeric_limits<int64_t>::max(); 
    uint64_t c = std::numeric_limits<uint64_t>::max(); 
    int64_t d = std::numeric_limits<int64_t>::max(); 

    a = (0xFFFFF00000000000 & a) >> 44; 
    b = (0xFFFFF00000000000 & b) >> 44; 
    c = 0xFFFFF & (c >> 44); 
    d = 0xFFFFF & (d >> 44); 
    cout << "a = " << a << "; c = " << c << "; a?=c = " << (a==c) << endl; 
    cout << "b = " << b << "; d = " << b << "; b?=d = " << (b==d) << endl; 

    return 0; 
} 

이 생성 : 당신이 내 구현을위한 서명 또는 서명에 대한 이전 또는 이후에 이동할 경우 훨씬 중요하지 않는 것

a = 1048575; c = 1048575; a?=c = 1 
b = 524287; d = 524287; b?=d = 1 

$ c++ --version 
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin12.5.0 
Thread model: posix