Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

Re^3: Efficient bit counting with a twist.

by Anonymous Monk
on Jun 01, 2013 at 00:41 UTC ( #1036355=note: print w/replies, xml ) Need Help??

in reply to Re^2: Efficient bit counting with a twist.
in thread Efficient bit counting with a twist.

Maybe I'm crazy, but this doesn't seem to work:
#!/usr/bin/perl use strict; use warnings; my $mask = hex($ARGV[0]); my $setbits = unpack("%32b*", $mask); printf("0x%x has %d set\n", $mask, $setbits);

Then I run it:
./bittest 0xff
0xff has 11 set

Or worse:
./bittest 0x1001
0x1001 has 14 set

Even the simple case:
./bittest 0
0x0 has 2 set

What is going on here?

Replies are listed 'Best First'.
Re^4: Efficient bit counting with a twist.
by BrowserUk (Pope) on Jun 01, 2013 at 09:49 UTC
    What is going on here?

    I tweaked your code by adding a couple of extra print statements:

    my $mask = hex($ARGV[0]); print $mask; print unpack 'H*', $mask; my $setbits = unpack("%32b*", $mask); printf("0x%x has %d set", $mask, $setbits);

    And when I run it I get this output:

    C:\test>junk 0xff 255 ## 3 bytes 323535 ## 6 nybbles with bit patterns 0011 0010 0011 0101 0011 0101 0xff has 11 set

    hex converts the string '0xff' to a number which you store in $mask;

    unpack expects a string, so perl helpfully converts the number stored in $mask to a string in the default decimal representation '255'.

    You are counting the bits in that 3 byte string.

    To count the bits in the number, you need to tell perl that you want the binary representation of that number:

    #! perl -slw use strict; my $mask = hex($ARGV[0]); print $mask; print unpack 'H*', pack 'C', $mask; my $setbits = unpack("%32b*", pack 'C', $mask ); printf("0x%x has %d set", $mask, $setbits); __END__ C:\test>junk 0xff 255 ff 0xff has 8 set

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1036355]
[stevieb]: choroba my GPS home device is done, at least prototype v1 is. I'm just making sure all of my code does what it says now
[stevieb]: I test/prototype code on my Pi, then I migrate it over to Arduino when it's ready (if that's a better platform for what I'm doing). The whole RPi stuff was for learning at first, then it snowballed. I'm just trying to get my in-house CI...
[stevieb]: ...done, which obviously requires a specific hardware setup.
[stevieb]: I don't write tests for the lower-level distributions (ie. ICs, sensors etc) within those distributions, I have all tests in a master distribution which encompasess all of the sub-modules

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (6)
As of 2017-06-25 22:56 GMT
Find Nodes?
    Voting Booth?
    How many monitors do you use while coding?

    Results (572 votes). Check out past polls.