Syntactic Confectionery Delight PerlMonks

### Re: bitwise string operator

by kennethk (Abbot)
 on Jun 13, 2013 at 17:23 UTC ( #1038802=note: print w/replies, xml ) Need Help??

in reply to bitwise string operator

You are performing bitwise operations, and using the character 0, not the number zero, to clean things up. If you type ord '0', you will see the zero character is 48, or 30 in hex (or see ASCII). The |= operator is a compound operator, which performs a bitwise-or between the left- and right-hand sides, and then assigns the result to the left-hand argument.

Your bitwise-xor (^) necessarily sets bits 7 and 8 to false since you only have alphabetics. The bitwise-or (|) sets the 5th and 6th bits to true. 0011xxxx (or xxx1100 if you are a little endian) corresponds to the ASCII column that contains all the numbers.

So your output is a series of numeric characters, not a number.

#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

Replies are listed 'Best First'.
Re^2: bitwise string operator
by romano (Initiate) on Jun 13, 2013 at 19:49 UTC
Thanks kenneethk

It took me a while to figure it out. I am putting your response in more explicit terms for neophytes like myself.

```\$Str1 = "AAAACCCCGGGGTTTT";
\$Str2 = "ACGTACGTACGTACGT";

\$cmp = \$Str1^\$Str2;
\$cmp |= '0' x length(\$cmp);

print "\$Str1\n";
print "\$Str2\n";
print "\$cmp\n";
```**OUTPUT**
AAAACCCCGGGGTTTT
ACGTACGTACGTACGT
0265204764035730
# What is ‘|=’ doing? This is bitwise ‘or’. Does ‘or’ on left side and right side (right side value is ‘0’ or 00110000). Puts result of ‘or’ in left side. Originally, the value in \$cmp for “A” ^ “G” was 00000110 (= 6) – this is ‘Acknowledgement’ – this is not a printable character.

By doing the ‘or’ with “0” (00110000 = 48) you convert ‘6’ to ‘6’ + ‘48’ = ‘54’ – this is the value for the character 6. So, \$cmp looked empty because all of the values are for non-printable characters.

A = 01000001
G = 01000111
^ 00000110 = 6 ‘Acknowledgement’

left 00000110
‘0’ 00110000
| (or) 00110110 = 54 ‘character 6’

******************

A = 01000001
T = 01010100
^ 00010101 = 21 ‘Negative Acknowledgement’

left 00010101
‘0’ 00110000
|(or) 00110101 = 53 ‘character 5’

Thanks again for your help,

romano (aka KennB)

Create A New User
Node Status?
node history
Node Type: note [id://1038802]
help
Chatterbox?
 [Corion]: A good morning! [Discipulus]: good morning Corion! [Corion]: I spent parts of yesterday digging into Filter::Simple to make it not change the line numbers of unfiltered code, but I think I need regex help (which will come in a SoPW I guess). I tried @lines = /((?:"...."|[^" \n]+)\n)/gs, but that matched on... [Corion]: ... foo "\0\0\0\n" bar\n by matching the first \n instead of matching the four-bytes-in- double-quotes part [Corion]: ... and I still don't understand why ;)

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (11)
As of 2017-01-23 08:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Do you watch meteor showers?

Results (191 votes). Check out past polls.