位操作相当于PERL中的pop函数(删除MSB)
-
12-10-2019 - |
题
在 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 和编译器慢得多。
不隶属于 StackOverflow