perl - 右移二进制 no 并获得变量中的移位位
问题描述
我有一个二进制不说,我在变量中有一个值说 value = 4。我想将二进制 no 右移存储在“value”变量中的位,然后想将移位的位存储在一个变量中,并且还想要保存在另一个变量中右移后获得的二进制数
例子:
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_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
推荐阅读
- mongodb - 如何 $match 文档中的数组元素与任何其他数组 - mongodb 聚合
- c++ - 用 C++ 连接数据库
- c++ - 如何在Arduino C++中通过引用传递字符串
- sympy - SymPy 中的嵌套总和
- thingsboard - Thingsboard 警报小部件 - “On row click”的自定义操作
- events - DDD:具有值对象集合的实体 - 一个事件还是多个?
- reactjs - 如何测试在挂载期间加载数据的 React 功能组件
- latex - 使用平方连接绘制流程图
- firebase - React Native 和 Firebase:从数据库中检索文档不起作用
- laravel - laravel 查询 OR 在连接表部分