http://www.perlmonks.org?node_id=1038802


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)