Hackerboard WikiHaboBlog

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

bitweise UND / bitweise ODER

Diskussion: bitweise UND / bitweise ODER im Forum Code Kitchen, in der Kategorie Software Home; hi leute, ich versuche momentan mit bitweisen operatoren klar zu kommen. das klappt auch soweit, jedoch lt. dieser definition: http://de.wikipedia.org/wiki/Bitweiser_Operator ...

Antwort
Alt 09.03.09, 10:54   #1 (permalink)
 
Benutzerbild von _fux_
 
Registriert seit: 13.09.05
_fux_ Leistung: Abacus
Likes: 5
Standard bitweise UND / bitweise ODER


hi leute,

ich versuche momentan mit bitweisen operatoren klar zu kommen. das klappt auch soweit, jedoch lt. dieser definition: http://de.wikipedia.org/wiki/Bitweiser_Operator
is dann folgendes enstanden:

Code:
#include <iostream>
using namespace std;

int main(){

	int flag[4]={1,4,5,8}; 
	int setFlag;
	int checkFlag;

	setFlag = flag[0] | flag[3]; // gesetzte flags sind 1 und 8
	
	for(int i=1;i<10;i++){
	checkFlag = setFlag & i; // prueft ob flag setzt (i muss checkFlag ergeben)
	if(i == checkFlag) cout << "Flag " << i << " gesetzt.\n";
	}

return 0;
}
nun, das problem ist, das er auch flags erkennt eigntlich gar nicht die nicht gesetzt sind - bei einigen funktioniert es korrekt.
meine frage wäre nun, wie ich denn eine bessere flagprüfungen machen kann, falles es sowas überhaupt gibt ;D
(wichtig wäre mir auch, das mit den | und & zu behalten, ansonsten wüsste ich auch andere möglichkeiten) ^^

achso, mir ist auch bewusst warum der die falschen flags erkennt, aber es muss doch eine möglichkeit geben?

LÖSUNG
ich sitz ja nich faul rum und warte bis jemand was sagt:
so finde ich immer die korrekten flags: (ich überspringe in der for-schleifen auch offensichtlich falsche flags):

Code:
#include <iostream>
using namespace std;

int main(){

	int flag[10]={2,4,8,16,32,64,128,256,512,1024}; 
	int setFlag;
	int checkFlag;

	setFlag = flag[2] | flag[7];
	
	for(int i=1;i<=1024;i=i*2){
	checkFlag = setFlag & i; // prueft ob flag setzt (i muss checkFlag ergeben)
	if(i == checkFlag) cout << "Flag " << i << " gesetzt.\n";
	}

return 0;
}
__________________
und?
_fux_ ist offline   Mit Zitat antworten
Alt 09.03.09, 11:04   #2 (permalink)
 
Benutzerbild von metax.
 
Registriert seit: 22.01.07
metax. Leistung: 8086
metax. eine Nachricht über ICQ schicken
Likes: 10
Standard

Du solltest nicht alle Zahlen von 1 - 10 durchprobieren, sondern nur die Zweierpotenzen.
Zu deiner Überprüfung:
setFlag = 1 | 8 // = 9 , da 0001 | 1000 = 1001

Überprüfung:
9 & 1 = 1 // Flag gesetzt
9 & 8 = 8 // Flag gesetzt
9 & 9 = 9 // Flag gesetzt

Wenn du dagegen auf i == setFlag prüfst (statt checkFlag), hast du dieses Problem auch nicht mehr.

Aber ich denke, du hast da noch einen Fehler in deiner Denkweise. Flags werden überlicherweise an einzelnen Bitstellen ausgewertet und dazu dient verUNDung und verODERung mit den entsprechenden Zweierpotenzen:

Flag #1 Setzen:
flagset = flagset | 2^0

Flag #3 Löschen
flagset = flagset & (not 2^2)

Flag #5 Prüfen
boolean test = (flagset & 2^4 == 2^4)

mfg, metax.
__________________
Wenn keiner zuschaut, teile ich heimlich durch Null!
Meine Homepage: Planet Metax | meine Bilder: DeviantArt | Twitter
metax. ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 09.03.09, 11:06   #3 (permalink)
Themenstarter
 
Benutzerbild von _fux_
 
Registriert seit: 13.09.05
_fux_ Leistung: Abacus
Likes: 5
Standard

hi danke für deine antwort
habe glaube ich gleichzeitig genau das gleiche gefunden, nur etwas anders programmiert

zum flag loeschen:
Code:
setFlag &= ~flag[0];
das klappt dann bei mir 1a

also hier nochmal der code mit 'korrekten' kommentaren:

Code:
#include <iostream>
using namespace std;

int main(){

	int flag[10]={2,4,8,16,32,64,128,256,512,1024}; 
	int setFlag;
	int checkFlag;

	setFlag = flag[0] | flag[1] | flag[8]; // setze flag mit ODER verküpfung
	
	for(int i=1;i<=1024;i=i*2){
	checkFlag = setFlag & i; // prueft ob flag gesetzt mit UND verküpfung (i muss checkFlag ergeben)
	if(i == checkFlag) cout << "Flag " << i << " gesetzt.\n";
	}
	
	cout << "\nein flag geloescht\n\n";
	setFlag &=   ~flag[0]; // ist das gleich wie: setFlag = ~flag[0] & setFlag;

	for(int i=1;i<=1024;i=i*2){
	checkFlag = setFlag & i; //  prueft ob flag gesetzt mit UND verküpfung 
	if(i == checkFlag) cout << "Flag " << i << " gesetzt.\n";
	}
	
cout << endl;
return 0;
}
__________________
und?
_fux_ ist offline   Mit Zitat antworten
Alt 09.03.09, 15:08   #4 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Du könntest auch direkt (setFlag & i) ohne ==i überprüfen, da alle Zahlenwerte !=0 in C/C++ als wahr gelten. Außerdem fehlt bei deinem flag-Array die 1.
Lesco ist offline   Mit Zitat antworten
Alt 10.03.09, 14:20   #5 (permalink)
 
Registriert seit: 28.07.08
ArnoNühm Leistung: Z3
Likes: 1
Standard

hier noch was aus der konserve:

Code:
inline void setbit(unsigned char bit, unsigned long& bitblock)
{
	bitblock |= (1 << bit);
}

inline void clearbit(unsigned char bit, unsigned long& bitblock)
{
	bitblock &= ~(1 << bit);
}

inline void switchbit(unsigned char bit, unsigned long& bitblock)
{
	bitblock ^= (1 << bit);
}

inline bool getbit(unsigned char bit, unsigned long bitblock)
{
	if((bitblock & (1 << bit)) != 0) return true;
	return false;
}
Vielleicht kannst du damit was anfangen.
ArnoNühm ist offline   Mit Zitat antworten
Alt 10.03.09, 15:08   #6 (permalink)
Themenstarter
 
Benutzerbild von _fux_
 
Registriert seit: 13.09.05
_fux_ Leistung: Abacus
Likes: 5
Standard

sieht nett aus
wenn ich wieder bisschen c++ übe schau ich mir das ganze nochmal genauer an. nice nice
__________________
und?
_fux_ ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » bitweise UND / bitweise ODER
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ipod oder Creative Zen, oder ganz was anderes mauralix Kaufberatung 10 20.02.08 17:40
Ipod oder Creative Zen, oder ganz was anderes mauralix HaBo Lounge 6 19.02.08 22:49
Bitweise Permutation in Java pi() Code Kitchen 8 07.05.07 22:43
Display kaputt ? Oder doch Adapter oder was anderes? Mackanzy Die Problemzone 0 25.11.04 23:55


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61