2013-04-29 4 views
-1

그래서 나는 두 개의 포인터가있다. 포인터의 주소 중 가장 중요하지 않은 4 비트를 같게 만들고 싶습니다. 그러나 어떻게해야할지 모릅니다.두 주소가 최하위 4 비트가 같은지 확인하는 방법은 무엇입니까?</p> <pre><code>unsigned char * a; unsigned char * b; </code></pre> <p>이의 내가 malloc을 사용하고는 특정 크기의 할당한다고 가정하자

우선, 가장 중요한 4 비트를 a에서 가져오고 싶습니다. 나는

int least = (&a) & 0x0f; 

뭔가를 시도했지만 나는 & 잘못된 피연산자라고 오류가 발생합니다. 나는 b을 더 할당하고 가장 중요한 4 비트가 a과 같은 주소를 검색하려고 생각했지만 어떻게 할 수 있는지 전혀 알지 못합니다.

+3

왜이 작업을 수행해야합니까? 지저분한 UB 해킹처럼 보입니다. –

+0

당신이 사용하고자하는 & & 때 –

+0

내가 세포와 함께 일하고 그리고 그 시간에 4 바이트를 보낼 mfc_put을 사용하고 소스와 대상의 주소의 가장 중요한 4 비트가 있어야합니다 – exilonX

답변

4
#include <stddef.h> 
#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    unsigned char *a; 
    unsigned char *b; 

    a = malloc(8); 
    b = malloc(8); 

    if (((uintptr_t)a & 0x0F) == ((uintptr_t)b & 0x0F)) { 
     printf("Yeah, the least 4 bits are the same.\n"); 
    } else { 
     printf("Nope, the least 4 bits are not the same.\n"); 
    } 

    free(a); 
    free(b); 

    return EXIT_SUCCESS; 
} 
+3

ptrdiff_t 대신 uintptr_t를 사용하면 안됩니다. –

+0

@PeteFordham :이 경우 중요하지 않다고 생각합니다. 그러나 'uintptr_t'는 아마 이데올로기 적으로 더 정확할 것입니다. 실제로'unsigned long'은 리눅스 커널 개발자에게 잘 맞습니다. –

+0

그래서 내가 가장 중요한 4 비트가 A와 같은 주소를 찾고 싶다면 어떻게해야합니까? – exilonX

0

이 어때 :

이 문제를 해결하는 한 가지 방법은 16 개 바이트 단위 (따라서, 최하위 4 비트에 정렬 된 할당을 반환 할당 함수를 사용한다
int least; 

least = (int)(&a)^(int)(&b); //this is a bitwise XOR, returning 0s when the bits are the same 

if (least % 16) = 0 then 
{ 
    //first four bits are zeroes, meaning they all match 
} 
+0

흠, 포인터의 주소가 아니라 포인터의 값을 취하는 것처럼 보입니다. –

+0

나는 그 질문에 그가 다음과 같이 질문하고 있다고 생각했다 : "나는 포인터의 주소 중 가장 중요한 4 비트를 동일하게 만들고 싶다." –

+0

조, 네가 실제로 맞을지도 모른다. –

0

항상 0이됩니다).

일부 플랫폼은 MSVC의 경우 _aligned_malloc() 또는 Unix 계열의 경우 posix_memalign()과 같은 정렬 보장 된 할당 기능을 가지고 있습니다. 이러한 할당자를 사용할 수없는 경우 평범한 바닐라 malloc()을 사용하여 정렬 된 메모리 블록을 반환하는 것은 일반적인 인터뷰 질문입니다. 인터넷 검색을 사용하면 여러 가지 가능한 솔루션을 얻을 수 있습니다.

2

이 시도 :

int main() 
{ 
    unsigned char *a, *b; 

    a = malloc(32); 
    b = a + 16; 

    printf("%p %p\n", a, b); // You should see that their least significative 
          // 4-bits are equal 
} 

a 이후와 b 16 떨어져 바이트 연속 메모리 블록의 일부, 자신의 주소가 당신이 원하는 속성을 가져야한다.

+0

실제로 낮은 4 비트가 같은지 확인하는 방법을 설명하지 않습니다. –

+0

NM, 질문이 확실하지 않습니다. 아래로 투표가 제거되었습니다. –

+0

예,이 스 니펫은 a와 b가 모두 하위 4 비트가 같음을 보장하므로 OP는이를 확인하지 않아도됩니다. 제목의 질문에 답하려고했습니다. 나는 그 질문이 불분명하다는 것에 동의한다. – bsmartins