Как эффективно использовать модуль BitVector In Perl, чтобы найти XOR двух чисел? - PullRequest
1 голос
/ 03 февраля 2020

У меня возникают проблемы с выяснением того, как эффективно использовать модуль BitVector в Perl, чтобы найти Исключительное Или (XOR) двух чисел в шестнадцатеричной форме.

Это весь мой код:

use Bit::Vector;
$bits = Bit::Vector->Word_Bits();  #  bits in a machine word

print "This program will take two numbers and will return the XOR of the two numbers.\n";

print "Enter the first number in hexadecimal form:\n";
$firstHexNumber = <STDIN>;
$vector = Bit::Vector->new($bits, $firstHexNumber);  #  bit vector constructor

print "Enter the second number in hexadecimal form:\n";
$secondHexNumber = <STDIN>;
$vector2 = Bit::Vector->new($bits, $secondHexNumber);  #  bit vector constructor

$vector3 = Bit::Vector->new($bits);  #  bit vector constructor
$vector3->Xor($vector,$vector2);

print $vector3;

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

Когда я ввожу 1 и 16 в качестве аргументов, вывод должен быть 17. Пожалуйста, помогите мне понять, что не так с моим кодом, чтобы получить вывод правильно. Спасибо.

Ответы [ 2 ]

4 голосов
/ 03 февраля 2020

Нет необходимости в модуле.

# Make sure the bitwise feature wasn't activated (e.g. by `use 5.022;`)
no if $] >= 5.022, feature => qw( bitwise );

my $hex1 = '012345';
my $hex2 = '000AAA';

my $hex_xor = unpack('H*', pack('H*', $hex1) ^ pack('H*', $hex2) );

say $hex_xor;  # 0129ef

или (5,22 +)

# Safe. Feature accepted without change in 5.28.
use experimental qw( bitwise );

my $hex1 = '012345';
my $hex2 = '000AAA';

my $hex_xor = unpack('H*', pack('H*', $hex1) ^. pack('H*', $hex2) );

say $hex_xor;  # 0129ef

или (5,28 +)

use feature qw( bitwise );  # Or: use 5.028;  # Or: use v5.28;

my $hex1 = '012345';
my $hex2 = '000AAA';

my $hex_xor = unpack('H*', pack('H*', $hex1) ^. pack('H*', $hex2) );

say $hex_xor;  # 0129ef

Эти решения работают с числа произвольной длины, поэтому я предполагаю, что Bit :: Vector был выбран для использования. (Просто добавьте числа так, чтобы они имели одинаковую длину, если необходимо, или Perl будет эффективно заполнять нулями справа.)

2 голосов
/ 03 февраля 2020

Можно использовать new_Hex() и to_Hex():

use strict;
use warnings;
use Bit::Vector;
my $bits = Bit::Vector->Word_Bits();  #  bits in a machine word
my $firstHexNumber = "1";
my $vector = Bit::Vector->new_Hex($bits, $firstHexNumber); 
my $secondHexNumber = "17";
my $vector2 = Bit::Vector->new_Hex($bits, $secondHexNumber);
my $vector3 = Bit::Vector->new($bits);  #  bit vector constructor
$vector3->Xor($vector,$vector2);
print $vector3->to_Hex;

Выход :

0000000000000016
...