The behavior of binary arithmetic operators depends on whether they're used on numbers or strings. The operators treat a string as a series of bits and work with that (the string "3" is the bit pattern 00110011). The operators work with the binary form of a number (the number 3 is treated as the bit pattern 00000011).
So, saying 11 & 3 performs the "and" operation on numbers (yielding 1). Saying "11" & "3" performs the "and" operation on strings (yielding "1").
Most problems with & and | arise because the programmer thinks they have a number but really it's a string. The rest arise because the programmer says:
if ("\020\020" & "\101\101") { # ... }but a string consisting of two null bytes (the result of "\020\020" & "\101\101") is not a false value in Perl. You need:
if ( ("\020\020" & "\101\101") !~ /[^\000]/) { # ... }