Hi All,
My keeper on bitwise operations:
-T
Perl: bitwise operators:
alias p5='perl6 -E'
alias p6='perl6 -e'
Shift Left and OR:
$ p6 'my Buf $x=Buf.new(0xAE,0x5D,0x5C,0x72);
my int32 $i=$x[3] +< 0x18 +| $x[2] +< 0x10 +| $x[1] +<
0x08 +| $x[0];
say $x; say $i.base(0x10);'
Buf:0x<AE 5D 5C 72>
725C5DAE
Bitwise += / ~=: Put and "=" after the bitwise operator:
$ p6 'my int32 $i=0x00005DAE; say $i.base(0x10); $i +<= 0x01; say
$i.base(0x10);'
5DAE
BB5C
$ p6 'my $v = 0b00100000; $v +|= 0b00010001; say $v;'
49
$ p6 'my $v = 0b00100000; $v +|= 0b00010000; say $v;'
48
Bitwise AND:
$ p6 'my $v = 32 +& 16; say $v;'
0
$ p5 'my $v = 32 & 16; say $v;'
0
Bitwise OR (note +|= example):
$ p5 'my $v = 32 | 16; say $v;'
48
$ p6 'my $v = 32 +| 16; say $v;'
48
$ p6 'my $v = 0b00100000; $v +|= 0b00010001; say $v;'
49
$ p6 'my $v = 0b00100000; $v +|= 0b00010000; say $v;'
48
Bitwise shift left:
$ p6 'my $v = 0b00000100 +< 2; say $v;'
16
$ p5 'my $v = 0b00000100 << 3; say $v;'
32
Bitwise shift right:
$ p5 'my $v = 0b00010100 >> 3; say $v;'
32
$ p6 'my $v = 0b00110100 +> 3; say $v;'
6
Bitwise XOR:
$ p6 'my $v = 0b00101101 ^ 0b00001001; say $v;'
36
$ p6 'my $v = 0b00001101 +^ 0b00001001; say $v;'
4
$ p6 'my uint8 $x = infix:<+^>( 0b1000_1010, 0b1010_0110 ); say
"00", $x.base(2);'
00101100
Bitwise NOT (Ones Complement or flip the bits):
$ p6 'my uint8 $x=0b1010_0110; my uint8 $y = +^$x; my uint8 $z = $y
+ 1;
say $x.base(2); say "0", $y.base(2); say "0", $z.base(2);'
10100110 # original
01011001 # one's complement
01011010 # two's complement
$ p6 'my uint8 $x= 0b1000_1010 +^ 0b1010_0110; say "00", $x.base(2);'
00101100
Bitwise "IN" or Pattern Test (Does y exist in x):
$ p5 'my $x = 0b1001; my $y = 0b1000; say qw(false true)[($x & $y)
== $y]'
true
$ p5 'my $x = 0b1001; my $y = 0b0100; say qw(false true)[($x & $y)
== $y]'
false
$ p6 'my $x=0b1001; my $y=0b0101; my $z=$x +& $y; say so $y == $z;'
False
$ p6 'my $x=0b1001; my $y=0b1001; my $z=$x +& $y; say so $y == $z;'
True