在 Perl 中,是否有一个按位运算符,其作用类似于 >>, ,但删除最高有效位?有点像如何 >> 运算符有点像 shift() 函数,我正在寻找一个像这样的位运算符 pop().

110110 会回来 10110

101 会回来 01

最终我试图看看二进制形式的数字是否是回文(即11011、111 或 1010101),因此理想情况下,操作员应该有办法返回它删除的位。如果运算符不这样做也没关系,因为我可以在数学上这样做,但为了干净的代码,如果它自动返回 MSB 那就太棒了。对于LSB,我愿意

$LSB=$mynum-2*($mynum>>1);
$mynum>>=1;
有帮助吗?

解决方案

我想不出一种简单的方法,而不仅仅是将其存储为字符串:

my $bits = sprintf '%b', $num;
while ( $bits =~ s/(.)// ) {
    print "removed $1\n";
}

虽然您的回文检查只是

$bits eq reverse $bits

其他提示

由于您的值具有可变的位数,因此您需要一点字符串或位向量。查看 位:: vector 在CPAN上 - 它似乎仍然活跃。

但是,正如其他人建议您的问题所建议的那样,您可能会更容易处理一个普通的旧字符串。

我不了解 Perl,但在 C/C++ 中你可以这样做:

unsigned flp2(unsigned x) {
   x = x | (x >> 1);
   x = x | (x >> 2);
   x = x | (x >> 4);
   x = x | (x >> 8);
   x = x | (x >>16);
   return x - (x >> 1);
}

unsigned most_significant_bit = flp2(my_number);
my_number &= most_significant_bit;

由黑客之乐提供。

请注意,要查找汇编程序中的最高有效位,您可以在 MSVC _BitScanReverse 和 GCC _builtin_clz 中使用 BSR。然而,据我所知,没有简单的高级(和便携式)运算符。语言的发展速度比 CPU 和编译器慢得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top