in reply to XOR, AND or NAND'ing bitstrings.

This is not a full solution for you, but rather some interesting fact.

You can use bit operations, like & and | directly against bit strings, but you have to make sure those strings have the same length (if not, add 0's to the beginning of the shorter one):
use strict; my $a = "0" . "1011"; my $b = "10011"; print $a & $b, "\n";#00011 print $a | $b;#11011
However, ^ and ~ do not work in this way.

The reason why it works for & and |:
use strict; print ord("0") & ord("0"), "\n";#48, which is "0" print ord("0") & ord("1"), "\n";#48, which is "0" print ord("1") & ord("0"), "\n";#48, which is "0" print ord("1") & ord("1"), "\n";#49, which is "1" print ord("0") | ord("0"), "\n";#48, which is "0" print ord("0") | ord("1"), "\n";#49, which is "1" print ord("1") | ord("0"), "\n";#49, which is "1" print ord("1") | ord("1"), "\n";#49, which is "1"
The reason why it does not work for ^:
use strict; print ord("0") ^ ord("0"), "\n";#0, which is not "0" print ord("0") ^ ord("1"), "\n";#1, which is not "1" print ord("1") ^ ord("0"), "\n";#1, which is not "1" print ord("1") ^ ord("1"), "\n";#0, which is not "0"