[PHP] PHP'en met bitjes gaat niet?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Ik heb eens wat gelezen over PHP's bitwise operators en die leken verdacht veel op de C++ versies. Ze zijn zelfs hetzelfde, dus een functie die er in C++ zo uitziet:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

int main()
{
    char c = 'a';
    int i;
    for( i = 128; i > 0; i = i / 2 )
    {
        if( i & c )
                cout << "1 ";
        else
                cout << "0 ";
    }
    system( "pause" );
    return 0;
}


Herschreef ik in PHP:
PHP:
1
2
3
4
5
6
7
8
9
10
function display_bits( $char )
{
    for( (int) $i = 128; (int) $i > 0; (int) $i = (int) $i / 2 )
    {
        if( $i & $char )
                echo '1 ';
        else
                echo '0 ';
    }
}

Zonder die type-casting gaat ie over op float.

Probleem:
In C++ is de lowercase 'a' 0110 0001
PHP maakt daarvan gewo0n 1111 1111

Vreemd niet?

Acties:
  • 0 Henk 'm!

  • dennisvz
  • Registratie: Mei 2003
  • Laatst online: 08-06 17:21

dennisvz

Intentionally left blank

Volgens mij pakt-ie de input-$char als een string en niet als een integer (ascii-value). Dat doet PHP alleen als beide kanten aan de expressie strings zijn.
Bitwise operators allow you to turn specific bits within an integer on or off. If both the left- and right-hand parameters are strings, the bitwise operator will operate on the characters' ASCII values.
edit:
Volgens mij klopt er iets niet in wat ik hierboven zeg...

[ Voor 30% gewijzigd door dennisvz op 05-02-2005 20:52 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Alleen werkt het casting systeem van PHP wat anders als dat van C. In PHP heb je sowieso al geen chars en worden strings niet naar hun ascii waardes gecast (zo doet C dat toch?) maar naar 0 als ze geen cijfers bevatten.
Daarbij werken de bitwise operators alleen op integers, zoals ook in de manual staat.
Bitwise operators allow you to turn specific bits within an integer on or off.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PrisonerOfPain schreef op zaterdag 05 februari 2005 @ 20:52:
Alleen werkt het casting systeem van PHP wat anders als dat van C. In PHP heb je sowieso al geen chars en worden strings niet naar hun ascii waardes gecast (zo doet C dat toch?) maar naar 0 als ze geen cijfers bevatten.
Daarbij werken de bitwise operators alleen op integers, zoals ook in de manual staat.

[...]
Samenvattend:
PHP:
1
2
3
4
5
6
7
8
9
10
function display_bits( $char )
{
       for( $i = 128; $i > 0; $i /= 2 )
    {
        if( (int) $i & (int) $char )
                echo '1 ';
        else
                echo '0 ';
    }
}

Toch? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Nee, die casts zullen (ook expliciet) fout gaan. Dus ord() gebruiken, ipv een cast.

Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function display_bits( $char )
{
    for( (int) $i = 128; (int) $i > 0; (int) $i = (int) $i / 2 )
    {
        if( (int) $i & (int) ord( $char ) )
                echo '1 ';
        else
                echo '0 ';
    }
}
?>


Zo werkt ie :)

[ Voor 31% gewijzigd door SH4D3H op 05-02-2005 21:37 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

SH4D3H schreef op zaterdag 05 februari 2005 @ 21:37:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function display_bits( $char )
{
    for( (int) $i = 128; (int) $i > 0; (int) $i = (int) $i / 2 )
    {
        if( (int) $i & (int) ord( $char ) )
                echo '1 ';
        else
                echo '0 ';
    }
}
?>


Zo werkt ie :)
Ehm, volgens mij hoef je toch echt niet elke keer te casten hoor. Je doet in dat hele script maar één keer een operatie waar $i een float zou kunnen worden, en dat is het stukje $i / 2. Bij mijn weten is $i verder gewoon een integer, ook zonder die casts.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
-NMe- schreef op zaterdag 05 februari 2005 @ 21:54:
[...]

Ehm, volgens mij hoef je toch echt niet elke keer te casten hoor. Je doet in dat hele script maar één keer een operatie waar $i een float zou kunnen worden, en dat is het stukje $i / 2. Bij mijn weten is $i verder gewoon een integer, ook zonder die casts.
Ik had het eerste met settype() gedaan, maar dat werkt niet eens :(
En, tsja, kan mij het schelen, PHP zou eens een beetje moeten opgroeien zodat je WEL aan kunt geven wat je wil:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
# Ik wil een integer
int $i;
# Ik wil een string
string $i;
# Ik wil een float
float $i;
# Etc ...
# Ik weet niet wat ik wil
$i; // dan overbodig, mja ;)
?>

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

SH4D3H schreef op zaterdag 05 februari 2005 @ 22:10:
Ik had het eerste met settype() gedaan, maar dat werkt niet eens :(
En, tsja, kan mij het schelen, PHP zou eens een beetje moeten opgroeien zodat je WEL aan kunt geven wat je wil:
Ik denk dat PHP er specifiek op richt om geen harde types te gebruiken, vanwege het gemak in de omgang in 99 van de 100 scripts. Voor die paar keer dat het wel uitmaakt kun je prima casten, maar zo overdrijven als jij gedaan hebt is ook weer niet de bedoeling denk ik. :) Je moet gewoon kijken hoe het intern gaat. $i = 128; -> je stelt $i in op de integer 128, in $i is dus een integer. Alle andere operaties die je daar verder op doet hebben geen effect op het type, behalve $i / 2, aangezien je daar een float uit kan krijgen. Alleen daar moet je dus casten. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Waarom trouwens niet gewoon dec2bin(ord($char));. Of was dit een oefening..? :P Over dat casten, kun je lang of kort zijn, maar het is nou eenmaal zo. Als je sterk getypeerde PHP wilt, zul je het zelf moeten maken aan de hand van objecten.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
-NMe- schreef op zaterdag 05 februari 2005 @ 20:58:
[...]

Samenvattend:
PHP:
1
2
3
4
5
6
7
8
9
10
function display_bits( $char )
{
       for( $i = 128; $i > 0; $i /= 2 )
    {
        if( (int) $i & (int) $char )
                echo '1 ';
        else
                echo '0 ';
    }
}

Toch? :P
PHP:
1
2
3
4
5
6
7
function display_bits( $char )
{
    for( $i = 128; $i > 0; $i /= 2 )
    {
        echo intval($i & ord($char));
    }
}


:P

[ Voor 6% gewijzigd door Michali op 06-02-2005 18:58 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 12:37

Zoefff

❤ 

SH4D3H schreef op zaterdag 05 februari 2005 @ 22:10:
[...]


Ik had het eerste met settype() gedaan, maar dat werkt niet eens :(
En, tsja, kan mij het schelen, PHP zou eens een beetje moeten opgroeien zodat je WEL aan kunt geven wat je wil:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
# Ik wil een integer
int $i;
# Ik wil een string
string $i;
# Ik wil een float
float $i;
# Etc ...
# Ik weet niet wat ik wil
$i; // dan overbodig, mja ;)
?>
Voor zover ik weet kan dat gewoon hoor.
PHP:
1
2
$i = (int) 1;
$j = (string) "123";


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Dat is niet hetzelfde :). In jou voorbeeld cast je namelijk een int (1) naar een int, en een string ("123") naar een string. Je dwingt niet af dat $i en $j altijd van het type string of int zijn. Ik kan namelijk nog onder dat stukje zetten $i = " 123" en geen interpreter die ik hoor klagen.
Pagina: 1