右移二进制 no 并在变量中获取移位位



我有一个二进制没有发言权,我在变量中有一个值说值= 4。 我想将二进制文件右移到存储在"value"变量中的位中,然后想将移位的位存储在一个变量中,并且还想保存右移后在另一个变量中右移后获得的二进制

no例:

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

现在我想最终有两个变量,一个包含二进制 no 后移位,一个变量包含移位位。

对于上面的例子,我想要的解决方案是

right_shifted_binary = 11000
bits_shifted = 0001

我找不到该问题的适当文档,因为大多数问题都在讲述算术右移。

基于$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_stringn";
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

最新更新