http://www.perlmonks.org?node_id=11107848


in reply to bit array comparison

Hello, Amendil,

It looks like perl's unpack interpreted $i and $u as ASCII chars:
perl -le 'printf "[%b]", ord for 2, 7'
OUTPUT:
[110010][110111]

Replies are listed 'Best First'.
Re^2: bit array comparison
by Amendil (Novice) on Oct 22, 2019 at 14:28 UTC

    Ok. unpack expects a string, but from other example I thought it would work.

    My ref were: https://www.perlmonks.org/?node_id=1015564 and https://www.oreilly.com/library/view/mastering-perl/9780596527242/ch16.html

    I will bench the perf of the following.

    use common::sense; my $a = 0; my $b = 0; $a += 1 << 0; $a += 1 << 1; $b += 1 << 1; $b += 1 << 2; my $i = $a & $b; my $u = $a | $b; my $i_cnt = () = sprintf("%b", $i) =~ /1/g; my $u_cnt = () = sprintf("%b", $u) =~ /1/g; printf "a is %b %d\n", $a, $a; printf "b is %b %d\n", $b, $b; printf "intersection is %b %d\n", $i, $i; printf "union is %b %d\n", $u, $u; say "set bit count in intersection: $i_cnt"; say "set bit count in union: $u_cnt";
      my $i_cnt = () = sprintf("%b", $i) =~ /1/g; my $u_cnt = () = sprintf("%b", $u) =~ /1/g;

      Minor point: for simple counting, tr/// (the transliteration operator) is preferred over m//g because it’s more efficient; also, the syntax is cleaner:

      my $i_cnt = sprintf('%b', $i) =~ tr/1//; my $u_cnt = sprintf('%b', $u) =~ tr/1//;

      Hope that’s of interest,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,