1

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

110110会回来10110

101会回来01

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

$LSB=$mynum-2*($mynum>>1);
$mynum>>=1;
4

4 回答 4

2

请参阅如何检查整数的二进制表示是否为回文?

于 2010-12-22T05:28:19.423 回答
2

我想不出比将其存储为字符串更简单的方法:

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

虽然那时你的回文检查只是

$bits eq reverse $bits
于 2010-12-22T05:29:22.270 回答
1

由于您的值具有可变位数,因此您需要一个位串或位向量。查看CPAN 上的Bit:: Vector——它似乎仍然处于活动状态。

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

于 2010-12-22T05:45:39.517 回答
0

我不了解 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;

由 Hacker's Delight 提供。

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

于 2010-12-22T05:32:32.347 回答