PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Suche LOGISCHEN bitwise operator! (https://www.php-resource.de/forum/php-developer-forum/89697-suche-logischen-bitwise-operator.html)

Schanz 24-01-2008 14:54

Suche LOGISCHEN bitwise operator!
 
Guten Tag an alle,

folgendes Problem... Ich habe folgenden Befehl/Ausdruck:

PHP-Code:

<?php
3084996963 
>> 29;
?>

So, leider versteht PHP unter dem >>-Operator ein "arithmetic shift", was ich suche ist allerdings ein "locigal shift".

Hier das was PHP macht:
PHP erkennt das erste bit als ein Vorzeichen an und verschiebt alle bits DANACH um 29 Stellen.
Code:

10110111111000010101000101100011 (Ausgangszahl - Binär)
1              0110111111000010101000101100011
^ Vorzeichen  ^ Zahl

Jetzt vollzieht PHP die Verschiebung..
Das Ergebnis ist '11' mit dem Vorzeichen '1' also -3!

Was ich will:
Code:

10110111111000010101000101100011

Nach Verschiebung:
00000000000000000000000000001011

Der Ergebnis ist also '1011' mit dem Vorzeichen '0' also 5!

Danke im voraus!

// Edit: Ich merke grade, dass es daran zu liegen scheint das PHP nicht mehr als 32 bits verträgt... Gibt es da eine möglichkeit das zu umgehen?

ghostgambler 24-01-2008 15:38

Was als Int nicht geht, macht man einfach als String *zucks*
PHP-Code:

<?php

echo decbin(3084996963) . "\n";
echo 
str_repeat("0"28) . substr(decbin(3084996963), 04);

Code:

X-Powered-By: PHP/5.2.0
Content-type: text/html

10110111111000010101000101100011
00000000000000000000000000001011


tontechniker 24-01-2008 15:38

Warum verschiebst du nicht um einen Wert der das Problem umgeht? PHP kennt nur diesen Bitoperator

H2O 24-01-2008 16:19

Wenn ich das folgende Script
PHP-Code:

$z1 3084996963;
$z2 $z1 >> 29;

echo 
decbin($z1) . "<br />";
echo 
decbin($z2) . "<br />";
echo 
$z1 "<br />";
echo 
$z2 "<br />";
echo 
floor($z1 pow(229)) . "<br />"

ausführe, erhalte ich unter Linux (CentOs 5) das folgende Resultat:
Code:

10110111111000010101000101100011
101
3084996963
5
5

, also das was du haben möchtest. Spasseshalber hab ich das Ganze noch auf meinem Windoof-Laptop getestet, und siehe da:
Code:

10110111111000010101000101100011
11111111111111111111111111111101
3084996963
-3
5

. Das ist offensichtlich das Verhalten deines Servers. Wenn du das umgehen willst, musst du die Division mit der Zweierpotenz nehmen, die funktioniert an beiden Orten

EDIT:

Eben fällt mir ein, dass das wahrscheinlich gar nicht am Betriebssystem liegt, sondern daran, dass es sich bei der Linux-Kiste um eine 64-Bit Maschine handelt


ghostgambler 24-01-2008 16:28

>.>
Vorher lesen was man postet...

Schanz 24-01-2008 16:55

Dankeschön euch beiden (ghostgambler und H2O), ich werde wohl die Potenzmethode nehmen.

Schanz 24-01-2008 17:28

So sorry für Doppelpost, aber bei einem edit guckt ihr vieleicht nicht mehr hin.

@ H2O:
Der Befehl
floor($z1 / pow(2, 3)) ist ja equivalent zu $z1 >> 3;

Hättest du auch einen für $z1 << 3; parrat?

(Also quasi die ersten 3 binären Ziffern abschneiden)

PHP-Desaster 24-01-2008 21:18

Multiplikation statt der Division?

H2O 25-01-2008 09:25

Zitat:

Original geschrieben von PHP-Desaster
Multiplikation statt der Division?
Aber sicher
Zitat:

Handbuch-Vorlese-Service:
$a << $b Nach links verschieben. Verschiebung der Bits von $a um $b Stellen nach links (jede Stelle entspricht einer Mulitplikation mit zwei).
$a >> $b Nach rechts verschieben. Verschiebt die Bits von $a um $b Stellen nach rechts (jede Stelle entspricht einer Division durch zwei).

PHP-Desaster 25-01-2008 09:36

Zitat:

Aber sicher
Sag ich ja

Schanz 25-01-2008 14:20

Ehmm ja das hab ich auch bereits probiert, allerdings wird die Zahl (binär gesehen) um 3 Stellen erweitert:

Code:

ERGEBNIS-SOLL:
10110111111000010101000101100011        (3084996963 - Vor dem Befehl)
10111111000010101000101100011000        (3205139224 - Nach dem Befehl)

C#.NET Befehl: z1 = (3084996963) << 3;

ERGEBNIS-IST:
10110111111000010101000101100011        (3084996963)
10110111111000010101000101100011000        (24679975704 - Nach dem Befehl)

PHP Befehl: $z1 = floor(3084996963 * pow(2, 3));


PHP-Desaster 25-01-2008 14:26

Liegt daran, dass PHP aus einem Int automatisch ein Float macht, wenn der Wertebereich zu klein wird. Vielleicht hilft ein Cast :dontknow:

Edit: Jepp. Folgender Code:
PHP-Code:

$s 3084996963;
$t $s pow2);
var_dump$tintval$t ), decbinintval$t ) ) ); 

ergibt die Ausgabe:
Code:

float(24679975704)
int(-1089828072)
string(32) "10111111000010101000101100011000

Edit2: << gibt dir direkt ein Integer und das richtige Ergebnis!

Schanz 25-01-2008 15:29

Hmmm ja stimmt darauf hätte ich auch kommen können "<<" unterstüzt ja nur 32 bit und das ist ja genau das was ich in diesem Fall will xD

Vielen Dank für die Hilfe =)


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:51 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG