# SPUG: pack

Chris Sutton chris at chriskate.net
Sun Mar 17 15:00:34 CST 2002

My use of pack/unpack

I have some code that generates an html table formatted family tree.  The
whole thing works by giving each entry a number which will determine where
they live in the table.  There are two parts which determine where they go:

1. which generation they belong to (\$g)
2. If they are male or female (1=male, 0=female).

The number assigned to an entry doesn't make any sense unless it's looked at
as a binary representation, which is what I use pack and unpack for.

Lets say we start with me at the bottom of the tree at generation.  I don't
get a number because I know where I go, but my father would have a number of
1 which looks like this in binary because he is a male and my mother would
have a number of 0.

Generation 1
1 - father of chris (duh, really boring, but stick with me)
0 - mother of chris

Next we look at the next generation in binary (generation 2)

11 - father of chris's father = 3 decimal
10 - mother of chris's father = 1 decimal
01 - father of chris's mother = 2 decimal
00 - mother of chris's mother = 0 decimal

Next generation (generation 3)
111 - father of chris's fathers father = 7 decimal
110 - mother of chris's fathers father = 3 decimal
101 - father of chris's fathers mother = 5 decimal
100 = 1 decimal
011 = 6 decimal
010 = 2 decimal
001 = 4 decimal
000 = 0 decimal

OK, how do I use pack?  In order to get the decimal number, which I use in
another place, I need to manipulate individual bits.

\$g = 3; # we are going to work on generation 3
\$child = 2; # father of chris's mother (01 in binary)
\$t = 1; # means we want to get the number for the father of \$child

\$b = pack("V",\$child);
# takes 2 decimal and makes it into a 32 bit binary number in "V" format and
# which I think was reverse network order (left to right reading or something)
# and this gives us something like 01000000000000000000000...

vec(\$b,\$g-1,1) = \$t;
# modifies the binary pack and sets bit 2 to 1 so our binary pack \$b looks
like 011000000000000000000000...

\$n = unpack("V",\$b); # converts that binary back into decimal 6

This is probably a trival use of pack and unpack but it took me a while to
figure out that I could even use pack and unpack to solve my problem which I
think is what Tim was talking about.

For those interested here is a link to what the tree actually looks like.

http://www.chriskate.net/tree.pl?pid=1

The only links that really work to navigate are the [+]'s which move you
around the tree.  I'm working on the rest at the moment.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
Subscriptions; Email to majordomo at pm.org:  ACTION  LIST  EMAIL
Replace ACTION by subscribe or unsubscribe, EMAIL by your Email-address
For daily traffic, use spug-list for LIST ;  for weekly, spug-list-digest
Seattle Perl Users Group (SPUG) Home Page: http://seattleperl.org