Reading through the previous bug report about /if &, it looks like the issue was due to atoi()/strtol() in newer versions of Visual C++ behaving differently when it comes to wrapping integers.
Both /if & and /set & originally used signed 32bit ints and were never meant to match $and() or any of the other bitwise identifiers, which were added much later.
Looking at the recent /if & change, I probably should have changed it to match the wraparound behaviour of v6.35, to maintain backward compatibility. But the behaviour changed in v7.x, over ten years ago, so backward compatibility has now been broken twice. At this point, I may as well just make both /if & and /set & use unsigned 32bit ints. This change will be in the next beta.