Битовая операция, эквивалентная поп-функции в PERL (удалить MSB) - PullRequest
1 голос
/ 22 декабря 2010

В Perl есть побитовый оператор, который действует как >>, но удаляет наиболее значимый бит? Вроде как оператор >> чем-то напоминает функцию shift(), я ищу битовый оператор, который похож на pop().

110110 вернется 10110

101 вернется 01

В конечном итоге я пытаюсь выяснить, является ли число в двоичной форме палиндромным (то есть 11011, 111 или 1010101), поэтому в идеале у оператора должен быть способ вернуть бит, который он удаляет. Это нормально, если оператор этого не делает, как я мог бы сделать математически, но в интересах чистого кода было бы здорово, если бы он автоматически возвращал MSB. Для LSB я делаю

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

Ответы [ 4 ]

2 голосов
/ 22 декабря 2010

Я не могу придумать более простой способ, чем просто сохранить его в виде строки:

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

хотя тогда ваш чек на палиндром просто

$bits eq reverse $bits
1 голос
/ 22 декабря 2010

Поскольку ваши значения имеют переменное число битов, вам нужна строка битов или битовый вектор.Проверьте Bit :: Vector на CPAN - кажется, что он все еще активен.

Но, как другие предложили для вашей проблемы, вам, вероятно, легче иметь дело с простым старымстрока.

0 голосов
/ 22 декабря 2010

Я не знаю о 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;

Предоставлено Хакерским Восторгом.

Обратите внимание, что для поиска наиболее значимого бита в ассемблере вы можете использовать BSR в MSVC _BitScanReverse, в GCC _builtin_clz. Однако, я не знаю простых (и переносимых) операторов высокого уровня. Языки развиваются намного медленнее, чем процессоры и компиляторы.

...