On 2020-02-05 20:12, Paul Procacci wrote:
I wasn't going to follow up but decided to do so since there is a small
but subtle bug in my original post.
I wouldn't want to mislead you Todd.
The \d has been changed to [0..9] as the expected input would only ever
be in that range. (\d includes Unicode Characters)
I've also included an alignment parameter (shadow'ing the sub written by
you Todd).
sub sbprint( Int $n, Int :$alignment = 8) {
my Int $padding = $alignment + $n.msb - ( $n.msb +& (
$alignment - 1 ) );
'0b' ~ "\%0{$padding}b".sprintf($n).comb(/<[0..9]> ** {
$alignment }/).join('_')
}
say sbprint 0x04F842;
say sbprint 0x04F842, :alignment(4);
# ./test.pl6
0b00000100_11111000_01000010
0b0100_1111_1000_0100_0010
I'm not suggesting you use my routine as I have no idea about what
you're requirements are but wanted to be sure my contribution to your
problem was sound.
Take Care.
On Wed, Feb 5, 2020 at 10:29 PM ToddAndMargo via perl6-users
<perl6-us...@perl.org <mailto:perl6-us...@perl.org>> wrote:
On 2020-02-03 13:51, ToddAndMargo via perl6-users wrote:
> Hi All,
>
> Is ther a way to get
>
> $ p6 'my uint8 $u = 84; printf "\$u = <%08s>\n", $u;'
> $u = <00000084>
>
> to print
>
> $u = <0000_0084>
>
> ?
>
>
> Many thanks,
> -T
Hi All,
Just to torment myself, I wrote a sub to do this:
.......................................
sub sbprint( UInt $b ) {
my $bits = $b.UInt.msb + 1;
my $bytes = $bits div 8;
if ($bits % 8 ) > 0 { $bytes += 1 };
# say "bits = $bits bytes = $bytes";
my Str $bitstr = "";
loop ( my $i = 0; $i < $bytes; $i += 1 ) {
my $j = ( $b +> ( $i * 8 ) ) +& 0xFF;
my $k = sprintf "_%08s", $j.base(2);
# say "b = $b.base(2) i = $i j = $j.base(2) k = $k";
$bitstr = $k ~ $bitstr;
# say $bitstr;
}
$bitstr = "0b" ~ $bitstr;
$bitstr ~~ s/ 0b_ /0b/;
return $bitstr;
}
say sbprint 0x04F842;
say 0x04F842.base(2);
.......................................
$ intTest.pl6
0b00000100_11111000_01000010
100 11111000 01000010 # spaces added by me
I like it!