& является побитовым и оператором, в этом случае вы возвращаете ver_ihl с 0xf, что приводит к очистке всех битов, кроме младшего значащего 4
0xff & 0x0f = 0x0f
ver_ihl определяется как первые 4 бита = версия + второй 4 = длина заголовка Интернета. Операция и удаляет данные версии, оставляя данные длины самостоятельно. Длина записывается как количество 32-битных слов, поэтому * 4 превращает ip_len в число байтов в заголовке
В ответ на ваш комментарий:
поразрядно и ands соответствующие биты в операндах. Когда вы и все, что с 0, становится 0, а все, что с 1, остается прежним.
0xf = 0x0f = двоичный 0000 1111
Таким образом, когда вы и 0x0f с чем-либо, первые 4 бита устанавливаются в 0 (как вы и сравниваете их с 0), а последние 4 бита остаются такими же, как в другом операнде (как вы делаете их против 1). Это распространенная техника, называемая битовой маскировкой.
http://en.wikipedia.org/wiki/Bitwise_operation#AND