왜 C에서 데이터 정렬을 위해 다음 매크로가 작동하는지 알고 싶습니까? #define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1)))
n이 7 일 경우 다음 매크로가 작동하는 이유는 무엇입니까? #define ALIGN8(x) (size_t)((~7)&((x)+7)
. 몇 가지 예를 들어 보여 주시고이 공식이 왜 효과가 있는지 말씀해 주시겠습니까? 데이터 정렬을위한 다른 유형의 수식이 있습니까?C에서 데이터 정렬을 수행하는 방법?
1
A
답변
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
종이에 비트를 긋고 각 단계의 효과를 확인 했습니까? – WhozCraig