G'day bartender1382,
"What I don't know how to do ... turn off a specific bit whether it is set or not."
Update:
This wasn't a good solution (see reply below).
The following would have been better:
#!/usr/bin/env perl
use strict;
use warnings;
my $var1 = 0b00010100;
my $var2 = 0b00000110;
my $fmt = "%08b\n";
print "Initial:\n";
printf $fmt, $var1;
printf $fmt, $var2;
for my $bit (0, 1, 4) {
print "Bit $bit off:\n";
$var1 &= ~(1 << $bit);
printf $fmt, $var1;
$var2 &= ~(1 << $bit);
printf $fmt, $var2;
}
I've stricken the original code; it's in the spoiler.
The output is unchanged.
-
Create a mask with the only bit set being the one you want to turn off.
-
If number AND mask is true, then number XOR mask.
Here's some example code:
#!/usr/bin/env perl
use strict;
use warnings;
my $var1 = 0b00010100;
my $var2 = 0b00000110;
my $fmt = "%08b\n";
print "Initial:\n";
printf $fmt, $var1;
printf $fmt, $var2;
for my $bit (0, 1, 4) {
print "Bit $bit off:\n";
$var1 = set_bit_off($bit, $var1);
printf $fmt, $var1;
$var2 = set_bit_off($bit, $var2);
printf $fmt, $var2;
}
sub set_bit_off {
my ($bit, $num) = @_;
my $mask = 1 << $bit;
$num ^= $mask if $num & $mask;
return $num;
}
Output:
Initial:
00010100
00000110
Bit 0 off:
00010100
00000110
Bit 1 off:
00010100
00000100
Bit 4 off:
00000100
00000100