Как я могу рассчитать базовый адрес указателя в C - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть указатель, как показано ниже:

char *p=malloc(94)

После долгих поисков по вычислению адреса базового указателя я нашел следующее решение:

e = log(size)

size = 1 << e

base = p & ˜(size-1);

Как работает эта формула?Кто-нибудь может объяснить это решение?

1 Ответ

0 голосов
/ 17 декабря 2018

Пререквизиты:

Эта инструкция:

size = 1 << e;

Означает сдвиг 1, e бита влево, что эквивалентно 1 * (2^e).

В этой инструкции:

base = p & ˜(size-1);

p & ˜(size-1) означает выполнение двоичного и (&) между p и унарным дополнением размера ((size-1)).

Пример:

allocation space
------------
|          | 0001 1111
------------
|     .    |
|     .    |
|     .    |
------------
|          | p = 0001 0100
------------
|     .    |
|     .    |
|     .    |
------------
|          | 0001 0000
------------

e = log(16) = 4

size = 1 << 4 = 0001 0000

size - 1 = 0000 1111

~(size -1) = 1111 0000

base = 0001 0100 & 1111 0000 = 0001 0000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...