2013-10-21 1 views
0

비트 단위 연산을 사용하여 루프를 만들었으므로 모든 다른 비트가 켜져 있습니다 (예 : 8 비트의 경우 01010101).uint64 및 uint32에서 작동하는 루프가 uint8 또는 uint16에서 작동하지 않습니다.

이론적으로 루프는 잘 작동하며 uint32 및 uint64에서는 작동하지만 uint8 또는 uint16에서는 정상적으로 작동하지 않습니다. 나는

여기 코드 이유 ... 궁금 : "작은 INT보다는"starblue으로

@autoreleasepool { 
    // a = 00000000 
    uint32 a = 0; 
    // b = 11111111 
    uint32 b = ~a; 
    // a = 11111111 
    a = ~a; 

    // if (a = 01010101) ~a = 10101010, a << 1 = 10101010 
    while (~a != (a << 1)) { 
     // 1st time: a << 1 = 11111110 = a 
     // 2nd time: a << 1 = 11111010 = a 
     a = a << 1; 
     // 1st time: ~a = 00000001 = a 
     // 2nd time: ~a = 00000101 = a 
     a = ~a; 
     // 1st time: a << 1 = 00000010 = a 
     // 2nd time: a << 1 = 00001010 = a 
     a = a << 1; 
     // 1st time: b^a = 11111101 = a 
     // 2nd time: b^a = 11110101 = a 
     a = b^a; 
    } 

    NSLog(@"%x", a); 
    NSLog(@"%u", b); 



    // Apply the same loop to a bigger scale 
    uint64 x = 0x0; 
    uint64 y = ~x; 
    x = ~x; 

    while (~x != (x << 1)) { 
     x = x << 1; 
     x = ~x; 
     x = x << 1; 
     x = y^x; 
    } 

    NSLog(@"%llx", x); 
    NSLog(@"%llu", x); 
} 
return 0; 
+1

에 오신 것을 환영합니다 SO에 대한 것입니다! 실제로 작동하지 않는 것에 관해 더 자세한 정보를 제공 할 수 있습니까? 당신은 어떤 결과물을보고 있습니까? – Derek

+0

감사합니다. 위의 코드는 정상적으로 작동하지만 uint32를 uint8 또는 uint16으로 대체하면 전체 코드가 무한 루프가됩니다. 나는 왜 그런지 이해하지 못합니다 ... – BridgeTheGap

+2

실패는 int보다 작은 변수에 대한 정수 승격 때문일 가능성이 큽니다. –

답변

0

sizeof(a) < sizeof(int)을 의미한다. 정수 승격 규칙으로 인해 int보다 작 으면 이 항상으로 승격됩니다. 우리가 = 0x5555이 몇 번 반복 실행하는이 uint8 또는 uint16이다 따라서 경우, ~a의 상위 비트는 항상 1이됩니다과는 uint16 경우 예를 들어 a << 1

같을 수 없다. 그 시점

(int)a = 0x00005555 
    ~a = 0xFFFFAAAA 
a << 1 = 0x0000AAAA 
=> ~a != (a << 1) 

프로그램 후 루프 영원히

관련 문제