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!

Reply via email to