Schrift
[thread]12802[/thread]

Frage zum Bitweisen AND

Leser: 1


<< >> 5 Einträge, 1 Seite
RoperC
 2008-11-21 19:31
#116499 #116499
User since
2008-11-21
6 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich mach noch nicht sehr lange Perl und habe bei der Verwendung vom Bitweisen AND Operator ein Problem.
Folgendes Szenario. Ich habe ein Programm in dem 2 Zahlen eingetragen werden und anschließen sollen diese Bitweise AND verknüpft werden.

Allerdings bekomme ich da teilweise ganz falsche Ergebnisse.
Hier der Code:

Code: (dl )
1
2
3
4
5
6
7
print "Geben Sie eine Zahl ein: ";
chomp($i = <STDIN>);
print "Geben Sie eine Zahl ein: ";
chomp($j = <STDIN>);

print "\n";
print $j & $i;


Ich habe dann mal etwas rumgegoogelt, ob ich vielleicht ein Grundlegendes Verständnisproblem habe und bin dabei auf ein Anwendungsbeispiel gestoßen bei dem die Zahlen mit printf als 8stellige Binärziffern ausgegeben werden.
Wenn ich meinen Code jetzt in dieser Form hier abändere funktionierts:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
print "Geben Sie eine Zahl ein: ";
chomp($i = <STDIN>);
print "Geben Sie eine Zahl ein: ";
chomp($j = <STDIN>);

printf("%08b", $i);
print "\n";
printf("%08b", $j);

print "\n";
print $j & $i;


Mir ist dabei nur total unbegreiflich warum. Liegt der Fehler vielleicht schon bei der Verwendung von chomp?
(Ein Ergebnis ist z.B. 000 bei den Zahlen 255 und 128)
pq
 2008-11-21 19:51
#116500 #116500
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Wenn die Zahlen über STDIN eingelesen werden, liegen sie nur als Strings vor. Sobald du
eine numerische Operation darauf ausführst, sind in der Variable zwei Werte gespeichert.
Code (perl): (dl )
1
2
3
4
5
use Devel::Peek;
my $x = "128";
Dump $x;
printf("%08b\n", $x);
Dump $x;


Wenn sowohl String als auch Zahl vorliegen, nimmt perl dann die Zahl. Das ist tatsächlich
etwas verwirrend. Du kannst in diesem Fall $i+=0 und $j+=0 vorher machen.

Aber mir ist dieser Fall noch nie untergekommen, deshalb war ich jetzt auch etwas überrascht.
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-21 20:31
#116502 #116502
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Man sollte noch dazu sagen, dass der &-Operator in Perl auch auf Strings anwendbar ist und dann den gesamten Inhalt der Strings Bit für Bit verrechnet.

Will man also mit zwei eingelesenen Werten numerisch rechnen, so muss man dafür sorgen, dass sie zuerst zweifelsfrei in Zahlen konvertiert werden, damit Perl nicht auf dumme Gedanken kommt ;-)

Das Problem ist ein ähnliches wie mit dem arithmetischen Operator + in JavaScript, welcher dort auch eine Stringverkettung durchführen kann...
When C++ is your hammer, every problem looks like your thumb.
RoperC
 2008-11-21 20:50
#116505 #116505
User since
2008-11-21
6 Artikel
BenutzerIn
[default_avatar]
Wow ihr seid echt schnell.^^

Danke für die Antworten, das klärt auch in etwa wie Perl überhaupt in der Lage ist String und Zahlen zu trennen.
murphy
 2008-11-22 05:13
#116523 #116523
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Am Rande bemerkt: Mit Hilfe des Standardmoduls CPAN:Scalar::Util kann man dieses Feature von Perl auch explizit ausnutzen. Sinnfreies Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
use Scalar::Util qw/dualvar/;

my $x = dualvar 42, 'the answer';

print "\$x contains $x\n"; # prints "$x contains the answer"
printf "\$x contains %d\n", $x; # prints "$x contains 42"
When C++ is your hammer, every problem looks like your thumb.
<< >> 5 Einträge, 1 Seite



View all threads created 2008-11-21 19:31.