print "Basic binary key bit numbers\n"; print "$_\t", dec_to_bin_text($_), "\n" for qw ( 0 1 2 4 8 16 32 64 128 255 ); print "\nSubnet Mask binary\n"; print "$_\t", dec_to_bin_text($_), "\n" for qw ( 255 254 252 248 240 224 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 = zero 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 - bit fliping\n"; print "This can be the basis or a simple encryption routine as in Active 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 fliping This can be the basis or a simple encryption routine as in Active State 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!