# RabbitFarm

### 2021-07-04

#### Packing and Unpacking from vacation: The Weekly Challenge 119

The examples used here are from the weekly challenge problem statement and demonstrate the working solution.

## Part 1

You are given a positive integer \$N. Write a script to swap the two nibbles of the binary representation of the given number and print the decimal number of the new binary representation.

### Solution

``````
use strict;
use warnings;
sub swap_nibbles{
my(\$n) = @_;
my \$bits = substr(unpack("B32", pack("N", shift)), 24, 8);
my \$swapped_bits = substr(\$bits, 4) . substr(\$bits, 0, 4);
my \$swapped_decimal = unpack("N", pack("B32", substr("0" x 32 . \$swapped_bits, -32)));
print \$swapped_decimal . "\n";
}

MAIN:{
swap_nibbles(101);
swap_nibbles(18);
}
``````

### Sample Run

``````
\$ perl perl/ch-1.pl
86
33
``````

### Notes

I was on vacation recently and did not have time for the last couple of Weekly Challenges, but as I posted a meme about it is hard to take a break!

(The Perl Programmers Facebook group is a lof of fun. It is kept Private by the group owner but joining is easy, anyone is allowed provided they are interested in Perl.)

I was able to get through the first part of this week's challenge with the time I had after getting back from vacation. As I was unpacking my suitcase, co-incidentally enough, I noticed that the first task is a great use of pack and unpack!

I have used these functions several times in the past, for example this writeup from Challenge 020 has an example and some links to others. I must admit that from the earliest days of my Perl experience I have been fascinated by pack! At first it seemed like a bit of black magic and due to its versatility, in some ways it still retains this mystique.

In the `swap_nibbles` function the number is packed into Network Byte Order and that representation is that unpacked bitwise to get the expected binary representation. After that the two nibbles are swapped using `substr` to get each 4 bit slice. The process is then reversed on the swapped bits to get the result we want.

## References

Challenge 119

Network Byte Order