按位运算符&逻辑

时间:2014-04-23 01:43:30

标签: perl bit-manipulation bitwise-operators bitwise-and

我需要澄清我遇到的问题。我目前正在尝试使用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&amp; n)/ 128等等。 虽然我明白为什么代码需要从128下降到1我似乎无法掌握&amp;之后的解决方案。我感觉很糟糕,因为我通常讨厌看解决方案,但这对我来说非常有趣,大多数其他编程书籍对按位运算符的关注非常小(如果有的话)。 我将非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

例如,十进制128是二进制的10000000&用这个给你最重要的一点。 / 128部分与向右移位7次相同,因为将数字除以2与向右移位一位相同。

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

向右移动7位,得到1

现在,为64

做同样的事情
  01000000 (= 64)
& 10000110 (= 134)
  00000000

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

对其余位执行此操作,您将获得10000110,从10000110语句中看print

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

#!/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 :(得分:1)

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

然后取结果并将其自行分割将得到0或1的结果。

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

sprintf "%b", 145;

输出:

10010001