Schrift
[thread]12737[/thread]

Mit Dualzahlen hantieren

Leser: 1


<< >> 6 Einträge, 1 Seite
Bastian
 2008-11-09 13:56
#116127 #116127
User since
2008-11-09
2 Artikel
BenutzerIn
[default_avatar]
Hallo Perlcommunity,

ich bin absoluter Perl-Anfänger und möchte folgendes tun:

5-stellige Dualzahlen von 00000 bis 11111 durchiterieren. Mein Versuch sieht so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
use strict;
use warnings;


for(1..(2**5-1)) {
   printf("%5b\n",$_);
}


Leider werden die Dualzahlen aber vorne nicht mit Nullen aufgefüllt. Außerdem würde ich gerne wissen, wie ich auf die einzelnen Ziffern der Dualzahl zugreifen kann. Mit Bitoperatoren und einer Bitmaske? Oder geht das in Perl anders?

Freu mich auf Antworten,..
Allerbeste Grüße!
bloonix
 2008-11-09 14:13
#116130 #116130
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
printf "%05b\n", $_ for 0..31;


Edit: korrigiert
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Bastian
 2008-11-09 14:24
#116131 #116131
User since
2008-11-09
2 Artikel
BenutzerIn
[default_avatar]
Danke, war fast richtig ;-)

so funktioniert es zumindest:
Code (perl): (dl )
printf "%05b\n", $_ for 0..(2 ** 5 - 1);


Aber wie arbeite ich jetzt mit den einzelnen Werten auf binärer Ebene?
Ich will folgendes tun:
Jede Dualzahl von 00000 - 11111 soll einzeln bearbeitet werden. Ich muss
dafür auf jede Dualziffer zugreifen können und testen, ob sie 1 oder 0 ist und dann dementsprechend weiter verfahren.

Hat jemand eine Idee?

Gruß
bloonix
 2008-11-09 14:30
#116132 #116132
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
for my $i (0..31) {
$i = sprintf("%05b", $i);
# nu kannst du $i verarbeiten
}

oder
Code: (dl )
1
2
3
for my $i (map { sprintf("%05d", $_) } 0..31) {
# nu kannst du $i verarbeiten
}
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2008-11-09 15:30
#116134 #116134
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Bastian, du brauchst eine zahl nicht in tatsächliche nullen und einsen umwandeln, wenn du einzelne
bits überprüfen willst.
sagen wir, du willst prüfen, welche bits bei $number gesetzt sind:
Code (perl): (dl )
1
2
3
for my $bit (0 .. 10) {
    warn "bit $bit is set? " . ($number & 2 ** $bit ? "yes" : "no");
}

und um konkret zu prüfen, ob bei $number das 2. bit von rechts gesetzt ist:
Code (perl): (dl )
if ($number & 2 ** 1)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
murphy
 2008-11-09 20:15
#116140 #116140
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
pq+2008-11-09 14:30:41--
[...]
und um konkret zu prüfen, ob bei $number das 2. bit von rechts gesetzt ist:
Code (perl): (dl )
if ($number & 2 ** 1)


Statt den Potenzieroperator zu verwenden kann man alternativ auch einen bitweisen Shiftoperator nehmen:
Code (perl): (dl )
if ($number & 1 << $bitposition) ...


Unter Umständen ist das ein paar Taktzyklen schneller (bei kleinen Zahlen ist der Unterschied sicher kaum messbar). Es ist aber vor allem nützlich zu wissen, dass es auch so geht, weil diese Methode auch in Programmiersprachen funktioniert, die keinen Potenzieroperator haben, wie zum Beispiel C oder Java ;-)
When C++ is your hammer, every problem looks like your thumb.
<< >> 6 Einträge, 1 Seite



View all threads created 2008-11-09 13:56.