In an attempt to piggyback on the people's vague fear of random lawsuits in Germany, I'll blog on how to remove the last octet of an IP in NGINX log files. <a href="https://blag.nullteilerfrei.de/2018/05/26/anonymize-ip-addresses-in-nginx-log-files/#more-4530" class="more-link">Do you want to know more or get sued?</a>


For reasons I have not yet been able to figure out, @tobi is making me implement a couple of very rudimentary routines in x86 GCC inline assembler because he wants them faster than possible for mere mortal C. The first was a routine to calculate $\lfloor\log_2(n)\rfloor$ for $n\in\mathbb{N}$ and the second one was to zero out a large block of memory. For instance, ```c unsigned inline log2int(unsigned x) { unsigned l; asm("bsrl %1, %0" : "=r" (l) : "r" (x)); return ( 1 << l == x ) ? l : l + 1; } ``` is about 50 times faster than the C-native Version ```c unsigned inline log2int(unsigned x) { unsigned l = 0; while(x > (1<<l)) l++; return l; } ``` even after optimization. For some reason, I found it tricky to google up the official intel x86 opcode reference ((<a href="http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf" target="_blank">Opcode Reference Part 1</a>)) ((<a href="http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2b-manual.pdf" target="_blank">Opcode Reference Part 2</a>)), so I am linking these here.