The containers package contains IntMap
and IntSet
types which use some bit fiddling tricks to achieve very high performance.
For example -x
xor x
. This bit fiddling trick is especially magical because it negates an unsigned value. It would be much nicer to express the meaning of this operation in a more natural way.
One possibility I could think of would be a regex-inspired of pattern matching mechanism which could look like this:
.*10{n} -> 1*0{n+1}
This syntax is supposed to mean: "Check if the input ends in a one followed by a number n
zeroes, if so produce a bitstring with all ones of the left and n+1
zeroes.
I think this is much easier to understand than the original which uses xor
, but it doesn’t quite feel perfect yet.
What do you think? Would you use this if it compiled to code that is as fast as the -x
xor x
? Do you have suggestions for improvement?
Good point. I was thinking of transformation that preserve the length of the bitstring like if you’re dealing with a type like
Word64
. Otherwise perhaps you could be more specific about it like this:.{m}10{n} -> 1{m}0{n+1}