[PHP] Waarden analyseren?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
allo,

ik zit met een vraagje,

als je een bepaalde variabele hebt bv een binair getal:

PHP:
1
 $gegevens='0101001'


waarbij elk bitje op een bepaalde uitgang slaat. bit 0 = uitgang 1 / bit 1 = uitgang 2 etc

nu wil ik iedere bit daaruit filteren, en in dit voorbeeld is bit 0 gelijk aan 1, dus is uitgang 1 actief

hoe kun ik dat juist voor elkaar krijgen om dit bit per bit te analyseren?

ik gebruik nu dit, maar ie heeft problemen omdat alle karakters na elkaar staan
PHP:
1
 list($bit0, $bit1, $bit2, $bit3, $bit4, $bit5, $bit6, $bit6, $bit7) = split('', $bin0);


alvast bedankt

Acties:
  • 0 Henk 'm!

Verwijderd

Wel eens van AND, OR en XOR gehoord ? Zoek eens in de PHP handleiding op 'Bitwise Operators'.

[ Voor 9% gewijzigd door Verwijderd op 02-02-2006 14:42 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 02 februari 2006 @ 14:41:
Wel eens van AND, OR en XOR gehoord ? Zoek eens in de PHP handleiding op 'Bitwise Operators'.
Die werken toch beter op een getalwaarde dan op een string, maar dat getal kan je weer vrij makkelijk met bindec krijgen.

Een simpele substr hierbij kan ook prima werken

Acties:
  • 0 Henk 'm!

Verwijderd

Je zou idd een function kunnen maken om ze te testen.

PHP:
1
2
3
4
function isBitSet( $text, $bitnr )
{
   return ( substr( $text, $bitnr, 1 ) == '1' ) ? true : false; 
}

Dit is een voorbeeld functie, geen idee of het werkt, is zeker niet veilig.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt voor de reacties, ik heb ik zo kunnen oplossen met substring

PHP:
1
2
3
4
5
6
7
8
9
10
$bin0 = "10000101";

$bit0 = substr ($bin0, -1);
$bit1 = substr ($bin0, -2,1);
$bit2 = substr ($bin0, -3,1);
$bit3 = substr ($bin0, -4,1);
$bit4 = substr ($bin0, -5,1);
$bit5 = substr ($bin0, -6,1);
$bit6 = substr ($bin0, -7,1);
$bit7 = substr ($bin0, -8,1);


en dan als bit0 gelijk is aan 1 .. dan is ingang 1 aangestuurd

bedankt ;)

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Uh werkt dit niet standaard?

PHP:
1
2
$bit0 = $bin0[0];
$bit1 = $bin0[1];

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

SchizoDuckie schreef op donderdag 02 februari 2006 @ 15:34:
Uh werkt dit niet standaard?

PHP:
1
2
$bit8 = $bin0[0];
$bit7 = $bin0[1];
Denk het wel... je maakte de zelfde fout als mij in je voorbeeld :P

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

De {} operator moet je gebruiken voor het indexen van strings.

$bit0 = $bin{0};

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Zowel [] als {} werkt. Waarom zou ik kiezen voor {} (kan het zo snel niet vinden ?)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Omdat [] voor strings deprecated is

.edit: linkje erbij: http://www.php.net/manual/en/language.types.string.php

[ Voor 82% gewijzigd door .oisyn op 02-02-2006 16:08 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
En om de leesbaarheid van je code te bevorderen;
PHP:
1
$bin0[1]
doet vermoeden dat je met een array van doen hebt.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tja, een string is feitelijk een array van characters, dus ik zie het probleem niet zo wat dat betreft. Maar dat zal idd de reden zijn waarom de {} notatie is geintroduceerd.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dit heb ik gebruikt als oplossing

PHP:
1
2
3
4
5
for ($i = 0; $i < 8; $i ++)
  if ((bindec($bin0) & pow(2,$i)) > 0)
    echo 'Digitale ingang ' . $i . '<span class="style2"> aangestuurd</span><br>' ;
  elseif ((bindec($bin0) & pow(2,$i)) < 1)
      echo 'Digitale ingang ' . $i . ' niet aangestuurd<br>' ;

[ Voor 20% gewijzigd door Verwijderd op 02-02-2006 16:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Uhhhmm waarom 2 if()s ? je hebt maar 2 mogelijke uitkomsten 1 of 0

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$value = bindec($bin0);
for( $i = 0; $i < strlen( $bin0 ); $i++ )
{   
    if( $value & pow(2,$i) )
    {
        echo $i.' wel<br>';
    }
    else
    {
        echo $i.' niet<br>';
    }
}

[ Voor 40% gewijzigd door Verwijderd op 02-02-2006 16:44 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

pow(2, $i) is overigens hetzelfde als 1 << $i, met als verschil dat die laatste een stuk sneller is :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op donderdag 02 februari 2006 @ 17:41:
pow(2, $i) is overigens hetzelfde als 1 << $i, met als verschil dat die laatste een stuk sneller is :)
Ik verwacht eigenlijk dat de code achter pow dit ook gewoon gebruikt.

[ Voor 4% gewijzigd door Verwijderd op 02-02-2006 17:51 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, want pow werkt met floating point waarden. pow(2.734, 3.4546) is bijvoorbeeld prima, met de shift gaat dat uiteraard niet werken (anders moet pow checken of de eerste parameter gelijk is aan 2 en de tweede parameter een geheel getal groter dan 0, dat is allemaal nogal special case natuurlijk) :)

[ Voor 41% gewijzigd door .oisyn op 02-02-2006 18:04 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

True, ook even getest natuurlijk.

code:
1
2
3
Loops: 1000000
Total Pow Time: 1.2630000114441sec ( 1.2630000114441E-006 seconds per pow )
Total Shift Time: 0.38279604911804sec ( 3.8279604911804E-007 seconds per shift )


edit:
Oeps we zijn aan het slow chatten

[ Voor 22% gewijzigd door Verwijderd op 02-02-2006 18:12 ]

Pagina: 1