| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
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 ...
![]() |
| | #1 (permalink) |
| Registriert seit: 13.09.05 ![]() Likes: 5 | 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;
} 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? |
| | |
| | #2 (permalink) |
| 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 | |
| | |
| HaBOT | |
| |
| | #3 (permalink) |
| Themenstarter Registriert seit: 13.09.05 ![]() Likes: 5 | 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]; 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? |
| | |
| | #4 (permalink) |
| Senior Member Registriert seit: 03.09.05 ![]() Likes: 0 | 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. |
| | |
| | #5 (permalink) |
| Registriert seit: 28.07.08 ![]() Likes: 1 | 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;
} |
| | |
![]() |
| | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ä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 |