1

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

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


print "Please enter the value(less than 256) you wish to be converted into binary\n";
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,但我似乎无法在 & 之后掌握解决方案。我感觉很糟糕,因为我通常讨厌看解决方案,但这对我来说非常有趣,大多数其他编程书籍都很少(如果有的话)关注位运算符。我将不胜感激。

4

2 回答 2

2

例如,十进制 128 是10000000二进制。&使用它可以为您提供最重要的位。/ 128部分与将位向右移动 7 次相同,因为将数字除以 2 与向右移动一位相同。

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

右移 7 位,你得到1

现在,为 64 做同样的事情

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

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

对其余的位执行此操作,您将得到1, 0, 0, 0, 0, 1, 1, ,从语句0中可以看出。10000110print

书中的代码基本上是这样的:

#!/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";
于 2014-04-23T02:02:17.407 回答
1

数字 1,2,4,8 都是 2 的幂。所以bitwise &任何带有它们的数字只有 2 个可能的值,即 2 或 0 的幂。

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

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

sprintf "%b", 145;

输出:

10010001
于 2014-04-23T01:46:49.833 回答