如何确保两个地址的最低有效4位相同?

时间:2013-04-29 16:54:52

标签: c bits memory-address

所以我有两个指点:

unsigned char * a;
unsigned char * b;

我们假设我使用了malloc并且它们被分配了一定的大小。 我想让指针地址的最不重要的4位相同......但我真的不知道如何。

首先,我想从a中取出最不重要的4位。我试过像

这样的东西
int least = (&a) & 0x0f;

但是我收到一个错误&是一个无效的操作数。我正在考虑为b分配更多,并搜索一个最低4位与a相同的地址,但我真的不知道如何做到这一点。

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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个字节并且是连续内存块的一部分,因此它们的地址应该具有您想要的属性。

答案 2 :(得分: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
}

答案 3 :(得分:0)

解决此问题的一种可能方法是使用仅返回在16字节边界上对齐的分配的分配函数(因此最低有效4位将始终为零)。

某些平台具有这种对齐保证的分配功能,例如MSVC中的_aligned_malloc()或Unix变体上的posix_memalign()。如果你没有这样的分配器,使用普通的香草malloc()返回一个对齐的内存块是一个常见的访谈问题 - 互联网搜索将为你提供许多可能的解决方案。