Maybe on a weekday evening you find yourself in need of some exclusive OR (XOR) operations on a machine that curiously doesn't have one built in.
Like... BASIC 2 on the Commodore VIC-20 and 64! Why it doesn't have XOR is probably just another example of trying to save precious ROM space.
I'm working on something for next week on the VIC-20 and I don't have a cartridge like Simon's BASIC like I do when I'm working on the 64 to give us Exclusive OR. It's actually called
EXOR in Simon's, presumably to make things as confusing as possible.
Method one - use the logic operators we DO have
We do have the tools in BASIC 2 to do an XOR. We just need to string an
OR and a
NOT AND together. It's the same:
10 X=133:Y=34 20 PRINT(X OR Y)AND NOT(X AND Y)
Easy enough right?
Method two - Add with carry out
The second one isn't terribly intuitive if you've not done much assembly programming, but if you use the carry from a binary addition it's an XOR:
10 X=133:Y=34 20 PRINT(X+Y)-2*(X AND Y)
Which is faster?
Just for fun, I compared 500 operations in each to see which is faster: pure logic, the addition method and Simon's BASIC.
The results are maybe surprising:
Simon's BASIC appears to make BASIC slower for this operation, so here's the "benchmark" without it.
Obviously the VIC doesn't have SIMON's, but it does have the other two. And for this sort of thing a VIC-20 is faster than a 64:
Happy coding (I told you it was quick)
Can we make this faster? We can a little. Let's remove the SIMON's lines and add a variable N to hold the count. Also initialize the X and Y variables.
128 needs some love
And just for completeness...
Integers would be faster you say?
You'd think so, but integers in Commodore BASIC are basically worthless. All operations are in floating point, so an integer is converted to a float, the operation performed and then converted back. I don't know if I'm aware of a situation where it's faster for anything.