NAME
Bit::Manip::PP - Pure Perl functions to simplify bit string manipulation
SYNOPSIS
use Bit::Manip::PP qw(:all);
my $b; # bit string
$b = 128; # 10000000
$b = bit_toggle($b, 4); # 10010000
$b = bit_toggle($b, 4); # 10000000
bit_toggle(\$b, 4); # same as above, but with a reference
$b = bit_off($b, 7); # 0
$b = bit_on($b, 7); # 10000000
bit_off(\$b, 7);
bit_on(\$b, 7);
# get the value of a range of bits...
# in this case, we'll print the value of bits 4-3
$b = 0b00111000; (56)
print bit_get($b, 4, 3); # 3
# set a range of bits...
# let's set bits 4-2 to binary 101
$b = 0b10000000;
$b = bit_set($b, 2, 3, 0b101); # 10010100
bit_set(\$b, 2, 3, 0b101); # reference
# clear some bits
$b = 0b11111111;
$num_bits = 3;
$lsb = 3;
$b = bit_clr($b, $lsb, $num_bits); # 11000111
bit_clr(\$b, $lsb, $num_bits); # reference
# helpers
my ($num_bits, $lsb) = (3, 2);
print bit_mask($num_bits, $lsb); # 28, or 11100
print bit_bin(255); # 11111111 (same as printf("%b", 255);)
DESCRIPTION
This is the Pure Perl version of the XS-based Bit::Manip distribution.
Provides functions to aid in bit manipulation (set, unset, toggle, shifting) etc. Particularly useful for embedded programming and writing device communication software.
Currently, up to 32-bit integers are supported.
EXPORT_OK
Use the :all
tag (eg: use Bit::Manip::PP qw(:all);
) to import the following functions into your namespace, or pick and choose individually:
bit_get
bit_set
bit_clr
bit_toggle
bit_on
bit_off
bit_bin
bit_count
bit_mask
FUNCTIONS
bit_get
Retrieves the value of specified bits within a bit string.
Parameters:
$data
Mandatory: Integer, the bit string you want to send in. Eg: 255
for 11111111
(or 0xFF
).
$msb
Mandatory: Integer, the Most Significant Bit (leftmost) of the group of bits to collect the value for (starting from 0 from the right, so with 1000
, so you'd send in 3
as the start parameter for the bit set to 1
). Must be 1
$lsb
Optional: Integer, the Least Significant Bit (rightmost) of the group of bits to collect the value for (starting at 0 from the right). A value of 0
means return the value from $msb
through to the very end of the bit string. A value of 1
will capture from $msb
through to bit 1
(second from right). This value must be equal to or lower than $msb
.
Return: Integer, the modified $data
param.
bit_set
Allows you to set a value for specific bits in your bit string.
Parameters:
$data
Mandatory: Integer, the bit string you want to manipulate bits in. Optionally, send in a reference to the scalar, and we'll work directly on it instead of passing by value and getting the updated value returned.
$lsb
Mandatory: Integer, the least significant bit (rightmost) in the bit range you want to manipulate. For example, if you wanted to set a new value for bits 7-5
, you'd send in 5
.
$bits
Mandatory: Integer, the number of bits you plan on setting. This is so that any leading zeros are honoured.
$value
Mandatory: Integer, the value that you want to change the specified bits to. Easiest if you send in a binary string (eg: 0b1011
in Perl).
Return: Integer, the modified $data
param if <C$data> is passed in by value, or 0
if passed in by reference.
Example:
You have an 8-bit register where the MSB is a start bit, and the rest of the bits are zeroed out:
my $data = 0b10000000; # (0x80, or 128)
The datasheet for the hardware you're writing to requires you to set bits 6-4
to 111
in binary (always start from bit 0, not 1):
10000000
^^^ ^
6-4 0
Code:
my $x = bit_set($data, 4, 3, 0b111); # (0x07, or 7)
printf("%b\n", $x); # prints 11110000
bit_clr
Clear (unset to 0) specific bits in the bit string.
Parameters:
$data
Mandatory: Integer, the bit string you want to manipulate bits in. Optionally, send in a reference to the scalar, and we'll work directly on it instead of passing by value and getting the updated value returned.
$lsb
Mandatory: Integer, the least significant bit (rightmost) in the bit range you want to manipulate. For example, if you wanted to clear bits 7-5
, you'd send in 5
.
$nbits
Mandatory: Integer, the number of bits you're wanting to clear, starting from the $lsb
bit, and clearing the number of bits to the left.
Return: Integer, the modified $data
param if <C$data> is passed in by value, or 0
if passed in by reference.
bit_toggle
Toggles a single bit. If it's 0
it'll toggle to 1
and vice-versa.
Parameters:
$data
Mandatory: Integer, the number/bit string to toggle a bit in. Optionally, send in a reference to the scalar, and we'll work directly on it instead of passing by value and getting the updated value returned.
$bit
Mandatory: Integer, the bit number counting from the right-most (LSB) bit starting from 0
.
Return: Integer, the modified $data
param if <C$data> is passed in by value, or 0
if passed in by reference.
bit_on
Sets a single bit (sets to 1
), regardless of its current state.
Parameters:
$data
Mandatory: Integer, the number/bit string to toggle a bit in. Optionally, send in a reference to the scalar, and we'll work directly on it instead of passing by value and getting the updated value returned.
$bit
Mandatory: Integer, the bit number counting from the right-most (LSB) bit starting from 0
.
Return: Integer, the modified $data
param if <C$data> is passed in by value, or 0
if passed in by reference.
bit_off
Unsets a single bit (sets to 0
), regardless of its current state.
Parameters:
$data
Mandatory: Integer, the number/bit string to toggle a bit in. Optionally, send in a reference to the scalar, and we'll work directly on it instead of passing by value and getting the updated value returned.
$bit
Mandatory: Integer, the bit number counting from the right-most (LSB) bit starting from 0
.
Return: Integer, the modified $data
param if <C$data> is passed in by value, or 0
if passed in by reference.
bit_mask
Generates a bit mask for the specific bits you specify.
Parameters:
$bits
Mandatory: Integer, the number of bits to get the mask for.
$lsb
Mandatory: Integer, the LSB at which you plan on implementing your change.
Return: Integer, the bit mask ready to be applied.
bit_bin
Returns the binary representation of a number as a string of ones and zeroes.
Parameters:
$data
Mandatory: Integer, the number you want to convert.
bit_count
Returns either the total count of bits in a number, or just the number of set bits (if the $set
, parameter is sent in and is true).
Parameters:
$num
Mandatory: Unsigned integer, the number to retrieve the total number of bits for. For example, if you send in 15
, the total number of bits would be 4
, likewise, for 255
, the number of bits would be 16
.
$set
Optional: Integer. If this is sent and is a true value, we'll return the number of *set* bits only. For example, for 255
, the set bits will be 8
(ie. all of them), and for 8
, the return will be 1
(as only the MSB is set out of all four of the total).
Return: Integer, the number of bits that make up the number if $set
is 0
, and the number of set bits (1's) if $set
is true.
AUTHOR
Steve Bertrand, <steveb at cpan.org>
LICENSE AND COPYRIGHT
Copyright 2017 Steve Bertrand.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.