2016-03-13 4 views
0

объяснений я пытался понять код распределителя памяти, который реализует таНос и я наткнулся на этом макросРаспределителя памяти макрос

// get the size of the block from header 
#define GET_SIZE(p) (GET(p) & ~0x7) 

Комментарий проясняет, что она делает, но я не могу понять, что это делает или как он работает. Может кто-нибудь объяснить это подробно?

+0

Он извлекает все, кроме 3 самых правых двоичных цифр значения, возвращаемого get (p). Грубо получить (p)% 8 сделать быстрее. –

+0

@ArifBurhan Так что же делает ~ 0x7? Я имею в виду, какова логика возвращения 3 самых правых цифр? – Krishh

+0

@ArifBurhan «сделано быстрее» - если вы используете компилятор 1970-х годов, возможно, –

ответ

3

В двоичном, 0x7 является .... 0000 0111 и ~0x7 является .... 1111 1000, так что значение GET(p) & ~0x7 является GET(p) «маскировки» его три самых правых битов, то есть, установив их к нулю.

Например, если GET(p) дает 10, который является .... 0000 1010, GET_SIZE(p) будет 8, который имеет двоичное представление .... 0000 1000.

Это похоже на GET(p) - GET(p) % 8, но GET(p) оценивается один раз в этом случае. Если GET_SIZE(p) определяется как GET(p) - GET(p) % 8, то что-то вроде GET_SIZE(i++) вызовет неопределенное поведение. Кроме того, это может повлиять на производительность, но современные компиляторы считаются достаточно умными, чтобы делать такие оптимизации.

+1

~ 7 средство переворота 7 в побитовым способом, а функция & имеет функцию битовой маски, пропускает некоторые и останавливает других. –

+0

Спасибо! Пример сделал это намного понятнее! – Krishh

+1

Большинство из них включают файлы, написанные в семидесятых годах и никогда не переписываемые, чтобы предотвратить появление новых ошибок. –

Смежные вопросы