I ended up using your idea of shifting off the least significant bit (saved some time doing !($i1 & $i2) instead of ($i1 & $i2) == 1).
The criteria to be in the list is complex (and I don't want to go off-topic). The numbers are highly constrained, yet once they make it to the list, I need to find all pairs of numbers which do not share any common bits (after getting rid of the one shared lsb).
Below is an example of a valid pair. The bit-wise complement may or may not exist in the list.
`#all values have been right shifted to get rid of lsb
$i1 = 0b1010_0100;
$i2 = 0b0100_1000;
#the above two numbers are a valid pair.
# yet my list may not contain either ~$i1 or ~$i2
$i1_bits_reversed = 0b0101_1011;
$i2_bits_reversed = 0b1011_0111
# the above two numbers are not a valid pair,
`
Does that example, clarify why the bitwise negation isn't a quick trick? I may be missing your approach altogether. |