Сдвиньте вправо двоичное нет и получите сдвинутые биты в переменной - PullRequest
0 голосов
/ 26 марта 2019

У меня есть двоичный код, и я имею значение в переменной скажем значение = 4. Я хочу сдвинуть вправо двоичное нет по количеству битов, хранящихся в переменной «value», а затем хочу сохранить сдвинутые биты в переменной, а также хочу сохранить двоичное нет, полученное после сдвига вправо, в другой переменной

Пример:

binary_number = 110000001
value =4 
then shifting no of bits in "value" to right (11000001 >> value)

Теперь я хочу, наконец, иметь две переменные, одну из которых содержит двоичный код no after shift и одну переменную со сдвинутыми битами.

Для приведенного выше примера, решение, которое я хочу, это

right_shifted_binary = 11000
bits_shifted = 0001

Я не могу найти надлежащую документацию для проблемы, так как большая часть проблемы говорит об арифметическом сдвиге вправо.

1 Ответ

1 голос
/ 26 марта 2019

Создайте битовую маску на основе $value и используйте оператор AND (&):

#!/usr/bin/perl
use warnings;
use strict;

my $binary = 0b110000001;
my $value  = 4;

# create mask with $value left-most bits 1
my $mask = ~(~0 << $value);

print "INPUT:     ", unpack("B*", pack("N", $binary)), " ($binary)\n";

# right shift by $value bits
my $right_shifted_binary = $binary >> $value;
print "RIGHT:     ", unpack("B*", pack("N", $right_shifted_binary)), " ($right_shifted_binary)\n";

# extract "remainder" of shift using mask
my $bits_shifted = $binary & $mask;
print "REMAINDER: ", unpack("B*", pack("N", $bits_shifted)), " ($bits_shifted)\n";

exit 0;

Тестовый прогон:

$ perl dummy.pl
INPUT:     00000000000000000000000110000001 (385)
RIGHT:     00000000000000000000000000011000 (24)
REMAINDER: 00000000000000000000000000000001 (1)

# Proof
$ echo "24 * 16 + 1" | bc
385

Если двоичный файлчисло указывается в виде строки, вы можете сначала преобразовать его в целое число:

my $binary_string = "110000001";
my $binary = unpack("N", pack("B32", substr("0" x 32 . $binary_string, -32)));

Но если это уже строка, решение будет намного проще:

#!/usr/bin/perl
use warnings;
use strict;

my $binary_string = "110000001";
my $value  = 4;

print "INPUT:     $binary_string\n";
print "RIGHT:     ", substr($binary_string, 0, -$value), "\n";
print "REMAINDER: ", substr($binary_string, -$value),    "\n";

exit 0:
$ perl dummy.pl
INPUT:     110000001
RIGHT:     11000
REMAINDER: 0001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...