2010-12-22 25 views
1

Gibt es in Perl einen bitweisen Operator, der wie >> funktioniert, aber das höchstwertige Bit entfernt? So ähnlich wie der >> Operator ist etwas wie die shift() Funktion, ich bin auf der Suche nach einem Bit-Operator, der wie pop() ist.Bitoperationsäquivalent der Popfunktion in PERL (MSB entfernen)

110110 zurückkehren würde 10110

101 zurückkehren würde 01

Letztendlich, ob eine Zahl in binärer Form zu sehen, ich versuche Palindrom ist (dh 11011, 111 oder 1010101), so idealerweise der Betreiber würde habe eine Möglichkeit, das entfernte Bit zurückzugeben. Es ist in Ordnung, wenn der Operator dies nicht tut, wie ich es mathematisch tun könnte, aber im Interesse von sauberem Code wäre es großartig, wenn es das MSB automatisch zurückgibt. Für das LSB, ich

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

Antwort

2

ich nicht von einer einfacheren Art und Weise denken kann, als nur als String zu speichern:

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

obwohl dann Palindrom Scheck gerade ist

$bits eq reverse $bits 
2
+0

Weißt du, ich habe viel zu lange damit verbracht, nach etwas zu suchen, um es nicht gefunden zu haben. Was bedeutet WORDSIZE in diesem Beispiel? –

+0

@Ranting_Raven, ich habe es gepostet, falls du es verpasst hast. WORDSIZE ist die Größe eines Wortes auf Ihrer Maschine (ich nehme an) –

0

ich weiß nicht, über Perl, aber in C/C++ Sie würden dies tun, wie so:

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; 

Mit freundlicher Genehmigung von Hacker's Delight.

Beachten Sie, dass Sie das BSR in MSVC _BitScanReverse in GCC _builtin_clz verwenden können, um das höchstwertige Bit in Assembler zu finden. Es gibt jedoch keine einfachen High-Level (und tragbaren) Betreiber, die ich kenne. Sprachen entwickeln sich viel langsamer als CPUs und Compiler.

1

Da Ihre Werte eine variable Anzahl von Bits haben, benötigen Sie einen Bit- oder Bitvektor. Check out Bit::Vector auf CPAN - es scheint immer noch aktiv zu sein.

Aber wie die anderen für Ihr Problem vorgeschlagen haben, ist es wahrscheinlich einfacher für Sie, einfach mit einer einfachen alten Zeichenfolge umzugehen.