Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??

Here is how it works and some example of how you use AND & OR | and XOR ^ with bit masks. AND is true is both bits AND-ED together are true, otherwise it is false. OR is true if either of the bits OR-ED together are true otherwise it is false. XOR (Exclusive OR )is true if only one of bits XOR-ED together is true. It is false if both bits are true or both bits are false. Although XOR might seem a little odd it has some particularly interesting properties.

print "Basic binary key bit numbers\n"; print "$_\t", dec_to_bin_text($_), "\n" for qw ( 0 1 2 4 8 16 32 64 12 +8 255 ); print "\nSubnet Mask binary\n"; print "$_\t", dec_to_bin_text($_), "\n" for qw ( 255 254 252 248 240 2 +24 192 128 0); print "\nWhat binary OR does - the | operator\n"; print do_or( 255, $_ ) for qw( 0 1 2 4 8 16 32 64 128 255 ); print do_or( 0, $_ ) for qw( 0 1 2 4 8 16 32 64 128 255 ); print "\nWhat binary AND does - the & operator\n"; print do_and( 255, $_ ) for qw( 0 1 2 4 8 16 32 64 128 255 ); print do_and( 0, $_ ) for qw( 0 1 2 4 8 16 32 64 128 255 ); print "\nWhat binary XOR does - the ^ operator\n"; print do_xor( 255, $_ ) for qw( 0 1 2 4 8 16 32 64 128 255 ); print do_xor( 0, $_ ) for qw( 0 1 2 4 8 16 32 64 128 255 ); print "\nUsing OR to set a bit in a bit mask to true\n"; print do_or( 0, 64 ); print do_or( 128, 64 ); print do_or( 255, 64 ); print "\nUsing XOR and AND to set a bit in a bit mask for false\n"; print "We want to set the 64 bit 0100000 and use the 255 XOR 64\n"; print "Which is 10111111 = 191 as a mask to do this\n"; print do_and( 255, 255^64 ); print do_and( 0, 255^64 ); print "\nUsing AND to get the value of a bit in a bit mask ( res = zer +o if not set, >0 if set )\n"; print do_and( 0, 64); print do_and( 255, 64); print "\nThe interesting property of double XOR against a bit mask - b +it fliping\n"; print "This can be the basis or a simple encryption routine as in Acti +ve State Perl App\n"; print "\nExample 1\n"; print do_xor( 255, 10 ); print do_xor( 255, 245 ); print "\nExample 2\n"; print do_xor( 123, 10 ); print do_xor( 123, 113 ); print "\n\nThere you go!\n"; sub do_or { my ( $b1, $b2 ) = @_; my $res = $b1 | $b2; $b1_txt = dec_to_bin_text($b1); $b2_txt = dec_to_bin_text($b2); $res_txt = dec_to_bin_text($res); return " $b1_txt = $b1 $b2_txt = $b2 ---OR--- $res_txt = $res "; } sub do_xor { my ( $b1, $b2 ) = @_; my $res = $b1 ^ $b2; $b1_txt = dec_to_bin_text($b1); $b2_txt = dec_to_bin_text($b2); $res_txt = dec_to_bin_text($res); return " $b1_txt = $b1 $b2_txt = $b2 --XOR--- $res_txt = $res "; } sub do_and { my ( $b1, $b2 ) = @_; my $res = $b1 & $b2; $b1_txt = dec_to_bin_text($b1); $b2_txt = dec_to_bin_text($b2); $res_txt = dec_to_bin_text($res); return " $b1_txt = $b1 $b2_txt = $b2 --AND--- $res_txt = $res "; } sub dec_to_bin_text { my $dec = shift; my $bin_str = sprintf "%08b", $dec; return $bin_str; } __DATA__ Basic binary key bit numbers 0 00000000 1 00000001 2 00000010 4 00000100 8 00001000 16 00010000 32 00100000 64 01000000 128 10000000 255 11111111 Subnet Mask binary 255 11111111 254 11111110 252 11111100 248 11111000 240 11110000 224 11100000 192 11000000 128 10000000 0 00000000 What binary OR does - the | operator 11111111 = 255 00000000 = 0 ---OR--- 11111111 = 255 11111111 = 255 00000001 = 1 ---OR--- 11111111 = 255 11111111 = 255 00000010 = 2 ---OR--- 11111111 = 255 11111111 = 255 00000100 = 4 ---OR--- 11111111 = 255 11111111 = 255 00001000 = 8 ---OR--- 11111111 = 255 11111111 = 255 00010000 = 16 ---OR--- 11111111 = 255 11111111 = 255 00100000 = 32 ---OR--- 11111111 = 255 11111111 = 255 01000000 = 64 ---OR--- 11111111 = 255 11111111 = 255 10000000 = 128 ---OR--- 11111111 = 255 11111111 = 255 11111111 = 255 ---OR--- 11111111 = 255 00000000 = 0 00000000 = 0 ---OR--- 00000000 = 0 00000000 = 0 00000001 = 1 ---OR--- 00000001 = 1 00000000 = 0 00000010 = 2 ---OR--- 00000010 = 2 00000000 = 0 00000100 = 4 ---OR--- 00000100 = 4 00000000 = 0 00001000 = 8 ---OR--- 00001000 = 8 00000000 = 0 00010000 = 16 ---OR--- 00010000 = 16 00000000 = 0 00100000 = 32 ---OR--- 00100000 = 32 00000000 = 0 01000000 = 64 ---OR--- 01000000 = 64 00000000 = 0 10000000 = 128 ---OR--- 10000000 = 128 00000000 = 0 11111111 = 255 ---OR--- 11111111 = 255 What binary AND does - the & operator 11111111 = 255 00000000 = 0 --AND--- 00000000 = 0 11111111 = 255 00000001 = 1 --AND--- 00000001 = 1 11111111 = 255 00000010 = 2 --AND--- 00000010 = 2 11111111 = 255 00000100 = 4 --AND--- 00000100 = 4 11111111 = 255 00001000 = 8 --AND--- 00001000 = 8 11111111 = 255 00010000 = 16 --AND--- 00010000 = 16 11111111 = 255 00100000 = 32 --AND--- 00100000 = 32 11111111 = 255 01000000 = 64 --AND--- 01000000 = 64 11111111 = 255 10000000 = 128 --AND--- 10000000 = 128 11111111 = 255 11111111 = 255 --AND--- 11111111 = 255 00000000 = 0 00000000 = 0 --AND--- 00000000 = 0 00000000 = 0 00000001 = 1 --AND--- 00000000 = 0 00000000 = 0 00000010 = 2 --AND--- 00000000 = 0 00000000 = 0 00000100 = 4 --AND--- 00000000 = 0 00000000 = 0 00001000 = 8 --AND--- 00000000 = 0 00000000 = 0 00010000 = 16 --AND--- 00000000 = 0 00000000 = 0 00100000 = 32 --AND--- 00000000 = 0 00000000 = 0 01000000 = 64 --AND--- 00000000 = 0 00000000 = 0 10000000 = 128 --AND--- 00000000 = 0 00000000 = 0 11111111 = 255 --AND--- 00000000 = 0 What binary XOR does - the ^ operator 11111111 = 255 00000000 = 0 --XOR--- 11111111 = 255 11111111 = 255 00000001 = 1 --XOR--- 11111110 = 254 11111111 = 255 00000010 = 2 --XOR--- 11111101 = 253 11111111 = 255 00000100 = 4 --XOR--- 11111011 = 251 11111111 = 255 00001000 = 8 --XOR--- 11110111 = 247 11111111 = 255 00010000 = 16 --XOR--- 11101111 = 239 11111111 = 255 00100000 = 32 --XOR--- 11011111 = 223 11111111 = 255 01000000 = 64 --XOR--- 10111111 = 191 11111111 = 255 10000000 = 128 --XOR--- 01111111 = 127 11111111 = 255 11111111 = 255 --XOR--- 00000000 = 0 00000000 = 0 00000000 = 0 --XOR--- 00000000 = 0 00000000 = 0 00000001 = 1 --XOR--- 00000001 = 1 00000000 = 0 00000010 = 2 --XOR--- 00000010 = 2 00000000 = 0 00000100 = 4 --XOR--- 00000100 = 4 00000000 = 0 00001000 = 8 --XOR--- 00001000 = 8 00000000 = 0 00010000 = 16 --XOR--- 00010000 = 16 00000000 = 0 00100000 = 32 --XOR--- 00100000 = 32 00000000 = 0 01000000 = 64 --XOR--- 01000000 = 64 00000000 = 0 10000000 = 128 --XOR--- 10000000 = 128 00000000 = 0 11111111 = 255 --XOR--- 11111111 = 255 Using OR to set a bit in a bit mask to true 00000000 = 0 01000000 = 64 ---OR--- 01000000 = 64 10000000 = 128 01000000 = 64 ---OR--- 11000000 = 192 11111111 = 255 01000000 = 64 ---OR--- 11111111 = 255 Using XOR and AND to set a bit in a bit mask for false We want to set the 64 bit 0100000 and use the 255 XOR 64 Which is 10111111 = 191 as a mask to do this 11111111 = 255 10111111 = 191 --AND--- 10111111 = 191 00000000 = 0 10111111 = 191 --AND--- 00000000 = 0 Using AND to get the value of a bit in a bit mask ( res = zero if not +set, >0 if set ) 00000000 = 0 01000000 = 64 --AND--- 00000000 = 0 11111111 = 255 01000000 = 64 --AND--- 01000000 = 64 The interesting property of double XOR against a bit mask - bit flipin +g This can be the basis or a simple encryption routine as in Active Stat +e Perl App Example 1 11111111 = 255 00001010 = 10 --XOR--- 11110101 = 245 11111111 = 255 11110101 = 245 --XOR--- 00001010 = 10 Example 2 01111011 = 123 00001010 = 10 --XOR--- 01110001 = 113 01111011 = 123 01110001 = 113 --XOR--- 00001010 = 10 There you go!

cheers

tachyon

s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print


In reply to Re: Re: What A Wonderful World: Bitmasks! by tachyon
in thread What A Wonderful World: Bitmasks! by Revelation

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • Outside of code tags, you may need to use entities for some characters:
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others cooling their heels in the Monastery: (12)
    As of 2014-08-20 17:02 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?

      The best computer themed movie is:











      Results (120 votes), past polls