2013-04-29 43 views
-1

所以,我有兩個指針:如何確保兩個地址的最低有效位4位相同?

unsigned char * a; 
unsigned char * b; 

讓我們假設我用malloc和他們被分配一定的規模。 我想使指針的地址的最低有效位4是相同的......但我真的不知道如何。

首先,我想從a中取最低有效4位。我想是這樣

int least = (&a) & 0x0f; 

但我得到一個錯誤,&是無效的操作數。我正在考慮爲b分配更多地址,並搜索與a相同的最低有效4位的地址,但我真的不知道該如何做到這一點。

+3

爲什麼你需要/做這個?看起來像一個討厭的UB黑客。 – 2013-04-29 16:55:55

+0

你用&當你想用&& – 2013-04-29 16:57:55

+0

我正在使用單元格,我想使用mfc_put發送4個字節的時間,我必須有最低有效4位的源地址和目標地址相同 – exilonX 2013-04-29 16:59:12

回答

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

不應該使用uintptr_t而不是ptrdiff_t。 – 2013-04-29 17:10:22

+0

@PeteFordham:我認爲在這種情況下並不重要,但是'uintptr_t'可能在意識形態上更加正確。從實踐中我可以看出,'unsigned long'通常很適合Linux內核開發人員。 – 2013-04-29 17:16:21

+0

所以,如果我想找到最低有效位4位的地址與A相同,我該怎麼做? – exilonX 2013-04-29 17:22:12

0

這個什麼:

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

嗯,它似乎是你正在接受指針的地址,而不是指針的值。 – 2013-04-29 17:18:57

+0

我以爲這就是他在這個問題中所要求的:「我想讓指針地址的最低有效位4是相同的......「 – 2013-04-29 17:20:17

+0

喬,是啊,你實際上可能是正確的! – 2013-04-29 17:22:52

0

解決這個問題的一種可能的方式是使用分配的功能,將只返回按16個字節邊界(因而也是最顯著4位對齊分配將始終爲零)。

某些平臺具有此類對齊保證分配功能,例如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 
} 

由於ab相距16字節和連續的內存塊的一部分,他們的地址應該有你想要的屬性。

+0

你實際上並不說明如何檢查是否低4位是相同的。 – 2013-04-29 18:27:47

+0

NM,問題只是目前還不清楚。反對票刪除。 – 2013-04-29 18:31:05

+0

是的,這段代碼保證了a和b都具有相同的低4位,所以OP不必檢查它們。我試圖回答標題中的問題。我同意這個問題不清楚。 – bsmartins 2013-04-29 18:45:21

相關問題