Avatar billede asn24 Nybegynder
18. december 2007 - 16:56 Der er 28 kommentarer og
1 løsning

Funktion til sammenligning af bitværdier?

Hej :)

Jeg sidder og laver et system hvor jeg har brug for at tjekke om værdien for f.eks. 25 er i en bitværdi jeg hiver ud fra databasen.

Hvordan ville i lave det?
Avatar billede barklund Nybegynder
18. december 2007 - 17:15 #1
En bitværdi? Du bliver nok nødt til at være lidt mere præcis og vise nogle eksempler på hvad du har og hvad du vil have ud af det :)
Avatar billede asn24 Nybegynder
18. december 2007 - 17:31 #2
Jeg har en funktion hvor brugeren kan tilmelde sig til den givne begivenhed. Der er 26 dage de kan tilmelde sig. Dag 1 = 0 og dag 26 = 25.

Jeg vil så ud fra det lave en edit funktion så de kan rette i deres tilmelding, derfor skal jeg have markeret mine checkboxes, og det er der mit problem opstår. Jeg skal nu have lavet et array ell. lign. der finder samtlige bitværdier for tallene fra 0 til 25, og tjekke om de er i den samlede værdi jeg hiver ud fra databasen.

Håber det var lidt mere forståeligt :)
Avatar billede barklund Nybegynder
18. december 2007 - 18:32 #3
Jamen, der findes kun to bitværdier - 0 og 1. Hvad har du i din database (bare et eksempel) og hvad har du og sammenligne med. Og hvilket resultat får du ud af det (boolean, et tal, noget tredje) og hvornår skal den give hvilket resultat?
Avatar billede zurekk Nybegynder
18. december 2007 - 19:46 #4
Er det den binære værdi af din decimal du vil sammenligne med?

Altså 25 == 11001?
Avatar billede asn24 Nybegynder
18. december 2007 - 21:14 #5
Så er jeg ikke sikker på det er binært.. Det er bitwise tror jeg nok det hedder.. 0=1 1=2 2=4 osv :)
Avatar billede kinderaeg Nybegynder
19. december 2007 - 09:15 #6
Ja, det hedder bitwise operators:
http://www.php.net/language.operators.bitwise
Avatar billede coderdk Praktikant
19. december 2007 - 09:31 #7
$ok = $dittal & 25;

?
Avatar billede coderdk Praktikant
19. december 2007 - 09:32 #8
nevermind, jeg er træt :-D
Avatar billede asn24 Nybegynder
19. december 2007 - 09:53 #9
Du er tæt på.. Hehe..

Det starter med at blive sat en masse værdier ind lagt sammen i databasen. Fra 0-25, og jeg skal nu have trukket dem ud af databasen igen, og se om tallet er indeholdt i mit udtræk. - Dette skal køres igennem med alle værdier fra 0-25 :)
Avatar billede kinderaeg Nybegynder
19. december 2007 - 11:07 #10
Så laver du jo bare et loop:

for($i=0; $i<=25; $i++) {
  if($dittal & $i) {
    //ok
  } else {
    //error
  }
}
Avatar billede pidgeot Nybegynder
19. december 2007 - 11:31 #11
Som jeg forstår det kan de tilmelde sig flere dage, og dette vil være repræsenteret i samme række - du må give et eksempel på din værdi i det tilfælde, for så kan det ikke være som coderdk og kinderaeg lidt tænker. (er 00011 1 og 2, eller 3 for sig selv?)
Avatar billede asn24 Nybegynder
20. december 2007 - 13:55 #12
Okay.. Jeg skal f.eks. finde ud af om værdien for 25 er i 7680 - og hvis den er det, så skal jeg have sat min checkbox med navn="Period25" til checked.. Håber det er lidt letteret forståeligt nu :)
Avatar billede asn24 Nybegynder
20. december 2007 - 14:01 #13
Hvis værdien for 1 også er der i, skal den selvfølgelig afkrydse begge mine bokse, med navnene Period1 og Period25 :)
Avatar billede asn24 Nybegynder
20. december 2007 - 14:04 #14
Lige en lille rettelse, det aktuelle tal jeg tester med er 67108863 :)
Avatar billede pidgeot Nybegynder
20. december 2007 - 14:05 #15
Nej, det er ikke lettere forståeligt, for vi ved stadig ikke hvordan dit tal er blevet genereret. Giv et eksempel på en værdi og de dage det skal svare til - kan du ikke det, så er det ikke sådan lige til at gætte hvad du skal bruge.

I øvrigt var det måske en ide at overveje en anden datastruktur hvor du netop ikke skal til at manipulere med et tal - det vil måske fylde lidt mere rent datamæssigt, men det vil være noget nemmere at navigere rundt i.
Avatar billede pidgeot Nybegynder
20. december 2007 - 14:12 #16
Lige en mere uddybende forklaring: Vi kan såmænd godt komme med et kvalificeret bud - jeg tror endda jeg har regnet den ud - men hvis du ikke selv ved hvordan tallet er genereret, så kan du vel heller ikke vide om vi har ret, og i stedet for at vi måske skal spilde tid på at lave løsninger der ikke fungerer i sidste ende, så er det bedre du giver os et konkret eksempel hvor vi får at vide hvad der er hvad. Sålænge der er et eller andet system, så skulle vi nok kunne fylde hullerne ud.
Avatar billede barklund Nybegynder
20. december 2007 - 14:13 #17
Altså, jeg gætter måske på, at du har et "tal" med en bitmaske:

0110001110101010111001110000110

Og hvis 25. bit er sat, så er man tilmeldt event 25, hvis 8. bit er sat, så er man tilmeldt event 8 og så videre? Er det korrekt opfattet?

--
Morten Barklund
Avatar billede asn24 Nybegynder
20. december 2007 - 14:13 #18
Jeg har desværre ikke mulighed for at rode med selve strukturen..

Tallet bliver lavet ud fra en række checkboxes, hvor værdien fra hver enkelt boks bliver lavet om, og så lagt sammen til sidst. Jeg er nu ved at lave en funktion hvor man kan redigere i hvilke checkboxes der skal være valgt. Derfor er jeg nødt til at regne tilbage igen.

Mine bokse hedder fra Period0 til Period25 - Jeg skal nu have lavet et loop der tjekker om værdien fra hvert enkelt boks er i mine data (i dette tilfælde 67108863), og hvis de er, så skal boksene være checked.

Her er min funktion der omregner fra min input form:


foreach ($_POST AS $id=>$val) {

    if(strpos($id,"Period")!==false) {
        $period[] = str_replace("Period","",$id);
    }
   
    if(strpos($id,"Tent")!==false) {
        $tent[] = str_replace("Tent","",$id);
    }
}

foreach ($period as $val) {
    $per = $per + (1 << $val);
}

foreach ($tent as $val) {
    $ten = $ten + (1 << $val);
}

Det er faktisk bare den jeg skal have vendt om igen, sådan da...

Håber jeg er mere forståelig nu :)
Avatar billede asn24 Nybegynder
20. december 2007 - 14:15 #19
Barklund:

Nej, ikke helt.. Jeg er over i bitwise operators (Overskriften er desværre lidt misvisende :)) - Læs mit forrige indlæg, så kan det være det er lidt nemmere at forstå :)
Avatar billede barklund Nybegynder
20. december 2007 - 14:25 #20
Det er præcis det jeg skrev :)

I dit tal er bit 4 sat, hvis man har tjekket af i "Period3". Dit tal 67108863 ser binært ud som:

11111111111111111111111111

Og der er samtlige bits altså sat. Kan det virkelig passe, at du vil teste på et tal, hvor du har tjekket samtlige bokse af?
Avatar billede asn24 Nybegynder
20. december 2007 - 14:32 #21
Jep, lige til en start vil jeg teste på et tal med alle bokse tjekket af :) - Jeg er slet ikke nede på binært niveau, er ikke sikker på du forstår mig..

Jeg roder med bitwise operators (Har jeg fundet ud af) - og der er det endelige tal i min databse 67108863, og det skal jo så splittes op og laves om til 0-25, alt efter hvilke værdier der eksistere :)
Avatar billede kinderaeg Nybegynder
20. december 2007 - 14:35 #22
For det første, så er 67108863 svarende til 26 bits, for det andet skal du så i stedet for at bruge fx 25 til at tjekke med, anvende 2^(25-1), for at tjekke om den 25. bit er sat, hvilket må være det du ønsker, som barklund også skriver.
Avatar billede barklund Nybegynder
20. december 2007 - 15:55 #23
Det skal IKKE splittes op. Alt er allerede tilstede.

Når du skal udskrive dine bokse, så er det noget med:

$value_from_database = 67108863;
print '<input type="checkbox" name="Period0" '.($value_from_database & 1 ? 'checked' : '').'/>';
print '<input type="checkbox" name="Period1" '.($value_from_database & 1<<1 ? 'checked' : '').'/>';
print '<input type="checkbox" name="Period2" '.($value_from_database & 1<<2 ? 'checked' : '').'/>';

Jeg håber du kan se mønstret :)

til kinderaeg: bitvis skift er lidt pænere og lidt mere logisk end pow :)
Avatar billede asn24 Nybegynder
20. december 2007 - 16:00 #24
Hey guys :)

Nu fandt jeg endelig ud af det :)

$j = ($festival->endFestival-$festival->startBefore)/86400;
$tentdays = $j;
$perioddays = $j;

for($i=0; $i<=$perioddays; $i++) {   
    if($period & (1 << $i)) {
        $checked[$i] = "checked";
    }
}

for($i=0; $i<=$tentdays; $i++) {   
    if($tent & (1 << $i)) {
        $checked2[$i] = "checked";
    }
}

Det var scriptet der klarede det for mig :) - ud over det har jeg selvfølgelig en variabel i checkboksen der hedder $checked[$perioddays] og $checked2[$tentdays]

Jeg siger tusind tak for hjælpen! - Hvis i lige smider et svar, skal jeg sørge for at dele pointene mellem jer :)
Avatar billede kinderaeg Nybegynder
20. december 2007 - 16:09 #25
@barklund
Det har du helt ret i, men det er måske ikke så nemt at forstå, hvis man ikke ved hvordan det fungerer. Mit eksempel var for at overskueliggøre hvordan sammenhængen er ;)

@asn24
Smid bare pointene efter barklund, det er trods alt ham der har lavet det meste af benarbejdet ;)
Avatar billede asn24 Nybegynder
20. december 2007 - 16:12 #26
@kinderaeg
Det skal jeg gøre ;)
Avatar billede barklund Nybegynder
20. december 2007 - 16:28 #27
Mokay :)
Avatar billede barklund Nybegynder
20. december 2007 - 17:03 #28
Jeg takker - og jeg håber du forstod essensen :)
Avatar billede asn24 Nybegynder
20. december 2007 - 17:31 #29
Jeg fandt da ihvertfald ud af det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester