2016-04-20 2 views
-4

Мне нужно написать скрипт Perl, который преобразует двоичное число, заданное как аргумент , в десятичное число. В этом вопросе есть намек на использование функции reverse.Perl-скрипт для преобразования двоичного числа в десятичное число

Мы должны предположить, что двоичное число в этом формате

Binary

EDIT: Это то, что я прогрессировал до (обратите внимание, это код из моего учебника, что я перепутались с) :

#!/usr/bin/perl 
# dec2.pl: Converts decimal number to binary 
# 
die("No arguments\n") if ($#ARGV == -1) ; 

foreach $number (@ARGV) { 
    $original_number = $number ; 
    until ($number == 0) { 
     $bit = $number % 2 ; 
     unshift (@bit_arr, $bit) ; 
     $number = int($number/2); 
    } 
    $binary_number = join ("", @bit_arr) ; 
    print reverse ("The decimal number of $binary_number is $original_number\n"); 
    $#bit_arr = -1; 
} 

При выполнении:

>./binary.pl 8 
The decimal number of 1000 is 8 

Я не знаю, как это сделать, чтобы программа знала, чтобы добавить все 1 в число, которое вводится.

+7

Можете ли вы представить, какое решение будет без кода? то есть, используя ручку и бумагу? Это было бы первым шагом, потому что, если вы не знаете, как решить проблему, никакое количество кода не поможет. –

+0

Нет. Я никогда раньше не делал конверсии. – user3313728

+2

Тогда вам нужно начать. Вы переходите справа налево, сопоставляя биты '1' с степенями 2, которые соответствуют их положениям (2^0, 2^1, 2^2 и т. Д.) И отбрасывают бит' 0'. Тогда вы суммируете все. –

ответ

0

Прежде всего, вы можете конвертировать из двоичного кода в десятичный, а не наоборот, что означает, что вы принимаете ввод, например $binary = '1011001';.

Первое, что вам нужно сделать, это получить отдельные биты (а , и т.д.) от этого. Мы говорим о разделении строки на отдельные цифры.

for my $bit (split(//, $binary)) { 
    ... 
} 

Это должно быть отличной отправной точкой. При том, что у вас есть все, что вам нужно применить следующий рефакторинг формулы вы публикуемую:

п = (((...) * 2 + а 2) * 2 + а) * 2 + a

[Я понятия не имею, почему reverse рекомендуется. Можно использовать его, но это неоптимальным.]

+0

Спасибо к вашей иллюстрации, я увидел, что рекурсивное решение было решением. Все еще (безуспешно) работает над итерационным. –

0

Вы могли бы просто использовать Sprintf сделать преобразования для вас ...

sprintf("%d", 0b010101); # Binary string 010101 -> Decimal 21 

sprintf("%b", 21)   # Decimal 21 -> Binary 010101 string 

Конечно, вы также можете просто Eval двоичная строка с 0b перед указать двоичный:

my $binary_string = '010101'; 
my $decimal = eval("0b$binary"); # 21 
0

Вы не имеют, чтобы использовать reverse, но это позволяет легко думать о проблеме по показателям экспоненты и индексам массива.

use strict; 
use warnings; 

my $str = '111110100'; 
my @bits = reverse(split(//, $str)); 
my $sum = 0; 

for my $i (0 .. $#bits) { 
    next unless $bits[$i]; 
    $sum += 2 ** $i; 
} 
Смежные вопросы