[java] bitcompare met switch?

Pagina: 1
Acties:

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Topicstarter
Hoi, ik heb een klein vraagje.
Ik heb het volgende stukje code voor mijn ircbotje, zodra er een user in een kanaal komt wordt deze methode aangeroepen met daarbij de nickname en het kanaal.
de functie getUserStatus geeft een waarde terug afhankelijk van wat er voor deze user is ingesteld in de database, dit kan de waarde AVOICE, AOP of AKICK, of een combinatie van deze zijn (klinkt vreemd maar het is zo ;) dit is met name zo voor toekomstige "statussen")
Nu wil ik de code dmv een switch laten lopen vanwege de overzichtelijkheid, echter nu doet hij alleen als er maar 1 waarde is ipv de combinatie (uiteraard).
Ik kan natuurlijk wel extra regels toevoegen zoals een "case AVOICE+AOP" maar dat is natuurlijk niet 'netjes" en bovendien als er meer statussen bijkomen een ramp om te schrijven.
Hoe kan ik dit oplossen? Ik kan gewoon niet meer op de term komen die ik zoek hoe dit heet, het was iets met binair geloof ik maar zoek acties wijzen mij niets uit.
Wie helpt mij in de goede richting?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static final int AVOICE = 1;
public static final int AOP = 2;
public static final int AKICK = 4;

..

public void onJoin(String nickname, String channel){
    int userStatus = erkbot.getUserStatus(nickname,channel);
    switch (userStatus){
        case AVOICE:
            erkbot.setMode(channel,"+v " + nickname);
            break;
        case AOP:
            erkbot.setMode(channel,"+o " + nickname);
            break;
        case AKICK:
            erkbot.kick(channel,nickname);
            break;
    }
}

[ Voor 3% gewijzigd door Erkens op 04-05-2003 22:13 . Reden: ff code aangepast, miste een paar ; (just for search) ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ik neem aan dat userStatus een bitfield is?
je zou een bitcompare kunnen doen van alle nuttige bits in userStatus, en dan kijken of die 1 is, bv door (pseudo code, java is lang geleje)

// and userstatus met AVOICE
if(userStatus & AVOICE)
{
erkbot.setMode(channel,"+v " + nickname);
}
if(userStatus & AOP)
{
erkbot.setMode(channel,"+o " + nickname);
}
etc.

[ Voor 6% gewijzigd door EfBe op 04-05-2003 21:59 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Bedoel je niet gewoon:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void onJoin(String nickname, String channel){ 
    int userStatus = erkbot.getUserStatus(nickname,channel); 
    switch (userStatus){ 
        case AVOICE: 
            erkbot.setMode(channel,"+v " + nickname); 
            break; 
        case AOP: 
            erkbot.setMode(channel,"+o " + nickname); 
            break; 
        case AKICK: 
            erkbot.kick(channel,nickname); 
            break; 
        default: doe_wat_anders;
}

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Topicstarter
EfBe schreef op 04 mei 2003 @ 21:59:
Ik neem aan dat userStatus een bitfield is?
je zou een bitcompare kunnen doen van alle nuttige bits in userStatus, en dan kijken of die 1 is, bv door (pseudo code, java is lang geleje)

// and userstatus met AVOICE
if(userStatus & AVOICE)
{
erkbot.setMode(channel,"+v " + nickname);
}
if(userStatus & AOP)
{
erkbot.setMode(channel,"+o " + nickname);
}
etc.
thats it, tnx, zit ik echt zo lang op te staren en te zoeken :D

ff een vraagje dit is zeker niet mogelijk met een switch?

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Topicstarter
Verwijderd schreef op 04 mei 2003 @ 22:00:
Bedoel je niet gewoon:
Java:
1
        default: doe_wat_anders;
nee ;)
dat is als je iets wilt doen als de bovenstaande niet zijn geweest :)
dat is net niet wat ik wil

[ Voor 22% gewijzigd door Erkens op 04-05-2003 22:02 ]


Verwijderd

Erkens schreef op 04 May 2003 @ 22:01:
[...]

nee ;)
dat is als je iets wilt doen als de bovenstaande niet zijn geweest :)
dat is net niet wat ik wil
ok, maar gelukkig heb je je oplossing al :)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Erkens schreef op 04 mei 2003 @ 22:01:
[...]
thats it, tnx, zit ik echt zo lang op te staren en te zoeken :D
ff een vraagje dit is zeker niet mogelijk met een switch?
Nee, want je moet op ALLE mogelijkheden testen. een switch is een statement dat je gebruikt wanneer je 1 test doet en uit X aantal mogelijke uitkomsten van die test moet reageren. In jouw geval heb je X tests en als die tests slagen reageer je (zet een flag) of niet. :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Topicstarter
EfBe schreef op 04 May 2003 @ 22:05:
[...]

Nee, want je moet op ALLE mogelijkheden testen. een switch is een statement dat je gebruikt wanneer je 1 test doet en uit X aantal mogelijke uitkomsten van die test moet reageren. In jouw geval heb je X tests en als die tests slagen reageer je (zet een flag) of niet. :)
idd, nou goed, dan gebruiken we een if :)
* Erkens gaat verder prutsen, en bedankt ;)

edit:

ok, volgende probleem :P

Java:
293
if (userStatus & AVOICE){


code:
1
2
3
4
5
H:\ErkBot\ErkBot.java:293: incompatible types
found   : int
required: boolean
            if (userStatus & AVOICE){
                                       ^


uiteraard heb ik dit ook met de andere 2 :D
maar hoe moet ik dit casten/fixen?

[ Voor 29% gewijzigd door Erkens op 04-05-2003 22:29 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Bedoel je niet if (userStatus == AVOICE){

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Erkens schreef op 04 May 2003 @ 22:07:
ok, volgende probleem :P
Java:
293
if (userStatus & AVOICE){
Je mag van Java geen integers als booleans gebruiken (valt wat voor te zeggen), dus moet je expliciet testen of het resultaat 0 was:
Java:
293
294
295
if((userStatus & AVOICE) != 0) {
...
}
Dash2in1 schreef op 05 May 2003 @ 02:05:
Bedoel je niet if (userStatus == AVOICE){
Lees alsjeblieft de thread door, voordat je reageert...

[ Voor 22% gewijzigd door Soultaker op 05-05-2003 02:34 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Topicstarter
Soultaker schreef op 05 May 2003 @ 02:33:
[...]

Je mag van Java geen integers als booleans gebruiken (valt wat voor te zeggen), dus moet je expliciet testen of het resultaat 0 was:
Java:
293
294
295
if((userStatus & AVOICE) != 0) {
...
}
tuurlijk, ik heb wat zitten testen met casten maar dat wilde ook niet, dit werkt _o_

ik heb nu meteen eens nagedacht waarom dat is, en eigenlijk is het heel logisch

stel userStatus=5

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
userStatus: 0101
AVOICE:     0001
            ====
            0001 = 1
 
userStatus: 0101
AOP:        0010
            ====
            0000 = 0
  
userStatus: 0101
AKICK:      0100
            ====
            0100 = 4

je krjigt dus (uiteraard) de bitwaarden die kloppen terug omgezet naar weer een integer :)
tnx, dit moet gaan lukken nu.
Dash2in1 schreef op 05 May 2003 @ 02:05:
Bedoel je niet if (userStatus == AVOICE){
uiteraard bedoel ik dat niet ;)
want dat zou hetzelfde zjin als met die switch :)
want wat nu als userStatus=AVOICE+AKICK ;)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ja je moet die bitwise and results ff testen op 0. Ik wist niet meer uit mn hoofd of java wel of niet een boolean verwachtte (C# wel, maar C++ niet, dus ik gokte op 'niet', bleek 'wel' te zijn ;)). Je kunt nu overigens userStatus ook vervangen door een short of zelfs byte volgens mij, zoveel flags heeft IRC niet.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Topicstarter
EfBe schreef op 05 May 2003 @ 10:18:
Ja je moet die bitwise and results ff testen op 0. Ik wist niet meer uit mn hoofd of java wel of niet een boolean verwachtte (C# wel, maar C++ niet, dus ik gokte op 'niet', bleek 'wel' te zijn ;)). Je kunt nu overigens userStatus ook vervangen door een short of zelfs byte volgens mij, zoveel flags heeft IRC niet.
yup, hij wil dus perse een boolean hebben, dus dan geven we hem dat wel :P
om userStatus te veranderen, mja dan zou ik grote delen moeten herschrijven aangezien ik die int rechtstreeks uit de db krijg :P
Daarnaast wil ik behalve deze avoice, aop enzo ook nog andere zaken willen regelen kunnnen regelen in de toekomst, geen idee hoeveel, zal uiteraard nooit zoveel worden.
Maar als ik daar snelheidwinst mee haal kan ik er altijd nog over na gaan denken.


edit:
tnx Glimi voor title change ivm search

[ Voor 5% gewijzigd door Erkens op 05-05-2003 11:37 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Excuus, voor die loze opmerking van me, had idd de thread niet goed gelezen.
Pagina: 1