• 4 Posts
  • 78 Comments
Joined 1 year ago
cake
Cake day: June 10th, 2023

help-circle
rss




  • Leeches are such cool creatures. I had a run-in with them while canoeing in Manitoba. Just one or two latched on. It’s really incredible how they can move their bodies around in the water yet maintain the exact texture and fluidity of the water itself. You’d never be able to feel one if it brushed up against you.

    Also crazy how well whatever numbing chemical they produce works.

    If you want to safely observe one up close, you can get them to latch on to your finger nail where they can’t do any damage.








  • I believe the optimization came because the denominator was a power of two. In my memory, the function counted up all of the bytes being sent and checked to see that the sum was a power of 16 (I think 16 bytes made a single USB endpoint or something; I still don’t fully understand USB).

    For starters, you can split up a larger modulo into smaller ones:

    X = (A + B); X % n = (A % n + B % n) % n

    So our 16 bit number X can be split into an upper and lower byte:

    X = (X & 0xFF) + (X >> 8)

    so

    X % 16 = ((X & 0xFF) % 16 + (X >>8) % 16) % 16

    This is probably what the compiler was doing in the background anyway, but the real magic came from this neat trick:

    x % 2^n = x & (2^n - 1).

    so

    x % 16 = x & 15

    So a 16 bit modulo just became three bitwise ANDs.

    Edit: and before anybody thinks I’m good a math, I’m pretty sure I found a forum post where someone was solving exactly my problem, and I just copy/pasted it in.

    Edit2: I’m pretty sure I left it here, but I think you can further optimize by just ignoring the upper byte entirely. Again, only because 16 is a power of 2 and works nicely with bitwise arithmatic.