2014-04-23 3 views
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로 이동해야하는 이유가 무엇인지 이해하는 동안 & 이후에는 솔루션을 파악할 수 없습니다. 나는 일반적으로 솔루션을 보면서 싫어하기 때문에 기분이 좋지 않지만, 이것은 나에게 매우 흥미 롭다. 대부분의 다른 프로그래밍 서적은 비트 연산자에 매우 작은 관심을 두었다. 도움을 주셔서 감사합니다.

+0

에 대한 생각 (128), (64), 자신의 바이너리 형태와 AND 연산을 시도 같은 32, 16, 8, 4, 2, 1보기 예를 들어 숫자 5를 사용하여 결과를 확인하십시오. –

+2

'&'와'|'를 사용하는 이유를 설명하는 [this answer] (http://stackoverflow.com/a/9203101/589924)에 관심이있을 수 있습니다. – ikegami

답변

1

숫자의 1,2,4,8 2. 모든 힘 그래서 그들과 어떤 수의 bitwise & 만이 개 가능한 값이있을 것이다, 2 개의 전력 또는 0

그런 다음 결과를 측정하고 있습니다

sprintf "%b", 145; 

출력 :

0,123,516 자체로 나누어은 0 또는 덧붙여서

1. 바이너리 숫자로 변환하는 쉬운 방법 sprintf을 사용하는 결과를 제공

10010001 
+0

AND/나눗셈 프로세스의 예가 유용 할 것입니다. –

2

예를 들어, 십진수 128은 이진수로 10000000입니다. 이것으로 &을 보내면 가장 중요한 비트가됩니다. / 128 부분은 비트를 오른쪽으로 7 번 이동하는 것과 같습니다. 숫자를 2로 나누는 것이 오른쪽으로 1 비트 이동하는 것과 같습니다. 오른쪽으로 7 개 비트를 이동

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

, 64

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

오른쪽으로 6 개 비트를 이동하기 위해 같은 일을하고, 지금 1

를 얻을 (때문에 64 = 2^6) 당신이 0

이 비트의 나머지 부분에 대해이 작업을 수행 얻을, 당신은 얻을 것 1, 0, 0, 0, 0, 1, 1, 0이고 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"; 
+0

나는 빛을보기 시작했는데 이것은 실제로 도움이된다. 내가 시각화 할 수없는 한 가지 :/128이나 다른 것의 2 개의 숫자를 AND하는 결과를 어떻게 나누는 것이 변화와 동등한가? 이것은 내가 초심자로서 가장 투쟁하는 것들 중 하나입니다.구문을 이해하는 데 어려움이 있지만 문제를 해결하려고 할 때 해결책을 제시하는 것이 정말 어렵다는 것을 알게되었습니다. –

+0

나는 그 분야에서 전문가가 아니므로 잘못되었을 수도 있지만 이것이 기본 시스템의 기본 개념이라고 생각합니다. 조금만 움직일 때마다 (숫자) n을 곱하거나 나눕니다. 예를 들어 10 진수 100, 010, 001의 경우 숫자를 이동할 때 10으로 나눕니다. 이 경우 10이 기본입니다. * 특정 문제에 대한 해결책을 찾는 * 방법에 관해서는, 먼저 하나를 제외하고 모든 비트를 "마스크"하고 해당 비트가 '1'인지 '0'인지 확인합니다. 나머지는 똑같이하십시오. 하지만 필자는 @Miller가 언급 한보다 단순한 접근 방식을 선호합니다. – NigoroJr

+0

2의 거듭 제곱으로 나눈 값은 '정수 사용'이 유효하지 않으면 Perl에서 오른쪽 시프 팅과 같지 않음을주의하십시오. 예를 들어, '64/128'표현식은 '0.5'를 산출합니다. 이 질문의 맥락에서, 그것은 차이를 만들지 않습니다. – nwellnhof