Moin Moin!
Wundert mich halt, weil in C ist es anders Unter Verwendung welchen Datentyps ...? char,
Wie kommst Du auf das schmale Brett? Bit Shift ist eine Integer-Operation, die Perl natürlich auf Integern ausführt. Die Breite der Integer hängt an den Optionen, mit denen Perl compiliert wurde, typischerweise sind sie 32 Bit oder 64 Bit breit.
Zu sehen z.B. mit diesem Stückchen Code:
#!/usr/bin/perl
use strict;
use warnings;
my $x=1;
for (1..65) {
$x<<=1;
printf "1 << %2d = %065bb\n",$_,$x;
}
Mit einem 32-Bit-Perl sieht die Ausgabe so aus:
1 << 1 = 00000000000000000000000000000000000000000000000000000000000000010b 1 << 2 = 00000000000000000000000000000000000000000000000000000000000000100b 1 << 3 = 00000000000000000000000000000000000000000000000000000000000001000b 1 << 4 = 00000000000000000000000000000000000000000000000000000000000010000b 1 << 5 = 00000000000000000000000000000000000000000000000000000000000100000b 1 << 6 = 00000000000000000000000000000000000000000000000000000000001000000b 1 << 7 = 00000000000000000000000000000000000000000000000000000000010000000b 1 << 8 = 00000000000000000000000000000000000000000000000000000000100000000b 1 << 9 = 00000000000000000000000000000000000000000000000000000001000000000b 1 << 10 = 00000000000000000000000000000000000000000000000000000010000000000b 1 << 11 = 00000000000000000000000000000000000000000000000000000100000000000b 1 << 12 = 00000000000000000000000000000000000000000000000000001000000000000b 1 << 13 = 00000000000000000000000000000000000000000000000000010000000000000b 1 << 14 = 00000000000000000000000000000000000000000000000000100000000000000b 1 << 15 = 00000000000000000000000000000000000000000000000001000000000000000b 1 << 16 = 00000000000000000000000000000000000000000000000010000000000000000b 1 << 17 = 00000000000000000000000000000000000000000000000100000000000000000b 1 << 18 = 00000000000000000000000000000000000000000000001000000000000000000b 1 << 19 = 00000000000000000000000000000000000000000000010000000000000000000b 1 << 20 = 00000000000000000000000000000000000000000000100000000000000000000b 1 << 21 = 00000000000000000000000000000000000000000001000000000000000000000b 1 << 22 = 00000000000000000000000000000000000000000010000000000000000000000b 1 << 23 = 00000000000000000000000000000000000000000100000000000000000000000b 1 << 24 = 00000000000000000000000000000000000000001000000000000000000000000b 1 << 25 = 00000000000000000000000000000000000000010000000000000000000000000b 1 << 26 = 00000000000000000000000000000000000000100000000000000000000000000b 1 << 27 = 00000000000000000000000000000000000001000000000000000000000000000b 1 << 28 = 00000000000000000000000000000000000010000000000000000000000000000b 1 << 29 = 00000000000000000000000000000000000100000000000000000000000000000b 1 << 30 = 00000000000000000000000000000000001000000000000000000000000000000b 1 << 31 = 00000000000000000000000000000000010000000000000000000000000000000b 1 << 32 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 33 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 34 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 35 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 36 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 37 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 38 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 39 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 40 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 41 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 42 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 43 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 44 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 45 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 46 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 47 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 48 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 49 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 50 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 51 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 52 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 53 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 54 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 55 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 56 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 57 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 58 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 59 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 60 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 61 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 62 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 63 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 64 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 65 = 00000000000000000000000000000000000000000000000000000000000000000b
Ein 64-Bit-Perl sollte bis 1<<63 von 0 verschiedene Werte liefern.
Wenn Du Shift-Operationen auf eine gewisse Anzahl von Bits beschneiden willst, nutze den binären AND-Operator. substr ist an der Stelle einfach nur Verschwendung von Rechenzeit.
#!/usr/bin/perl
use strict;
use warnings;
my $x=1;
for (1..65) {
$x<<=1;
$x&=0xFFFF;
printf "1 << %2d = %065bb\n",$_,$x;
}
Ergebnis:
1 << 1 = 00000000000000000000000000000000000000000000000000000000000000010b 1 << 2 = 00000000000000000000000000000000000000000000000000000000000000100b 1 << 3 = 00000000000000000000000000000000000000000000000000000000000001000b 1 << 4 = 00000000000000000000000000000000000000000000000000000000000010000b 1 << 5 = 00000000000000000000000000000000000000000000000000000000000100000b 1 << 6 = 00000000000000000000000000000000000000000000000000000000001000000b 1 << 7 = 00000000000000000000000000000000000000000000000000000000010000000b 1 << 8 = 00000000000000000000000000000000000000000000000000000000100000000b 1 << 9 = 00000000000000000000000000000000000000000000000000000001000000000b 1 << 10 = 00000000000000000000000000000000000000000000000000000010000000000b 1 << 11 = 00000000000000000000000000000000000000000000000000000100000000000b 1 << 12 = 00000000000000000000000000000000000000000000000000001000000000000b 1 << 13 = 00000000000000000000000000000000000000000000000000010000000000000b 1 << 14 = 00000000000000000000000000000000000000000000000000100000000000000b 1 << 15 = 00000000000000000000000000000000000000000000000001000000000000000b 1 << 16 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 17 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 18 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 19 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 20 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 21 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 22 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 23 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 24 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 25 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 26 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 27 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 28 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 29 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 30 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 31 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 32 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 33 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 34 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 35 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 36 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 37 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 38 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 39 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 40 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 41 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 42 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 43 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 44 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 45 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 46 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 47 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 48 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 49 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 50 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 51 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 52 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 53 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 54 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 55 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 56 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 57 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 58 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 59 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 60 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 61 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 62 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 63 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 64 = 00000000000000000000000000000000000000000000000000000000000000000b 1 << 65 = 00000000000000000000000000000000000000000000000000000000000000000b
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".