Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: bitwise string operator

by kennethk (Monsignor)
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.


Comment on Re: bitwise string operator
Select or Download Code
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)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1038802]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (5)
As of 2014-07-13 17:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (251 votes), past polls