2013-10-15 2 views
1

왜 C에서 데이터 정렬을 위해 다음 매크로가 작동하는지 알고 싶습니까? #define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1))) n이 7 일 경우 다음 매크로가 작동하는 이유는 무엇입니까? #define ALIGN8(x) (size_t)((~7)&((x)+7). 몇 가지 예를 들어 보여 주시고이 공식이 왜 효과가 있는지 말씀해 주시겠습니까? 데이터 정렬을위한 다른 유형의 수식이 있습니까?C에서 데이터 정렬을 수행하는 방법?

+2

종이에 비트를 긋고 각 단계의 효과를 확인 했습니까? – WhozCraig

답변

2

의 목적 ~N, 이미 모든 상위 비트를 확인하기 위해 수의 존재 (N은 하나없는 당신이 찾는 정렬보다 임) 제대로되어 이 밀어 비트를 포함, 정렬 후 조명 유지 거기에 추가 작업을합니다. 정렬을위한 실제 올림은 N의 추가로 수행됩니다. 이렇게하면 올바른 자리 올림 비트가 더 높은 비트 위치로 푸시됩니다. ~N의 비트 AND는 맨 아래 비트가 스윕되는 것을 보장하면서 보장됩니다 , 그들이 필요하지 않기 때문에.

이 상상 :

00100011 : 35 
+ 00000111 : 7 
    -------- ---- 
    00101010 : 42 
& 11111000 : ~7 
    ---------- ---- 
    00101000 : 40 

또 다른 예 :

11101111 : 239 
+ 00000111 : 7 
    -------- ---- 
    11110110 : 246 
& 11111000 : ~7 
    -------- ---- 
    11110000 : 240 

그리고를 마지막으로, 이미 정렬로, 아무것도하지 않고 끝 예는 :

10100000 : 160 
+ 00000111 : 7 
    -------- ---- 
    10100111 : 167 
& 11111000 : ~7 
    -------- ---- 
    10100000 : 240 

내가해야 호출자 측에서 0이 아닌 값을 확인하는 것 이외에 오버플로를 방지 할 수는 없습니다. ch는 분명히 반올림 정렬 값으로 사용하려는 것이 아닙니다.

11111110 : 254 
+ 00000111 : 7 
    -------- ---- 
    00000101 : 5 (of) 
& 11111000 : ~7 
    -------- ---- 
    00000000 : 0 
관련 문제