按位运算符和逻辑



我需要澄清我遇到的一个问题。我目前正在尝试使用Perl网站的"学习Perl"部分提供的《入门Perl》一书来学习Perl。我已经到了第二章的结尾,我现在很难理解这本书提供的解决方案背后的逻辑。

#!usr/bin/perl
#Ex2_3.plx
use warnings;

print "Please enter the value(less than 256) you wish to be converted into binaryn";
my $bin = <STDIN>;
chomp ($bin);
print "The binary value of $bin is : ", "n";
#Use the bitwise and operator to determine the binary value:

print((128 & $bin) / 128);
print((64 & $bin) / 64);
print((32 & $bin) / 32);
print((16 & $bin) / 16);
print((8 & $bin) / 8);
print((4 & $bin) / 4);
print((2 & $bin) / 2);
print((1 & $bin) / 1);
print("n");

我似乎无法理解(128&n)/128等等背后的逻辑。虽然我确实理解为什么代码需要从128降到1,但我似乎无法理解&之后的解决方案;。我感觉很糟糕,因为我通常不喜欢看解决方案,但这对我来说非常有趣,大多数其他编程书籍都很少(如果有的话)关注位运算符。我会感谢你的帮助。

例如,十进制128是二进制的10000000&与此结合,可以得到最高有效位的位。/ 128部分与向右移位位7次相同,因为将数字除以2与向右移位一位相同。

  10000000 (= 128)
& 10000110 (= 134)
  10000000

向右移动7位,得到1

现在,对64 做同样的事情

  01000000 (= 64)
& 10000110 (= 134)
  00000000

向右移动6位(因为64=2^6),得到0

对其余的位执行此操作,您将获得10000110,它们将从print语句中查找10000110

书中的代码基本上与此相同:

#!/usr/bin/perl
use strict;
use warnings;
chomp(my $input = <STDIN>);
for (my $i = 7; $i >= 0; $i--) {
    print( (($input & (1 << $i)) >> $i) );
}
print "n";

数字1,2,4,8都是2的幂。因此,任何数字的bitwise &只有2个可能的值,2或0的幂。

然后取结果并将其除以自身,将得到0或1的结果。

顺便说一下,将数字转换为二进制的更简单方法是使用sprintf:

sprintf "%b", 145;

输出:

10010001

最新更新