kein Plan bei Bitoperatorenaufgabe (Bitlogik)- pos. erledigt geschlossen 

Status
Für weitere Antworten geschlossen.

kaufikaufi

Registered +
Registriert
Nov. 2008
Beiträge
97
hi, wir haben heute Bitlogik auf dem Lehrplan und diese Aufgaben fürs WE bekommen, ich seh da aber nicht durch, könnte mir jemand helfen bitte.

gruß
kaufikaufi


Aufgabe 1:

Schreiben Sie Funktionen, die folgendes leisten:

Ein Bit in einem int-Wert auf 0, auf 1 setzen oder negieren
Ein Bit testen

int setzebit(int alt,int pos) ...

Aufgabe 2:
Geben Sie in einer Funktion einen int-Wert als Text von
32 Binärziffern aus.

Aufgabe 3:

Schreiben Sie eine Funktion, die eine beliebige Folgen von
Binärwerten in einen reinen ASCII-Text verwandelt nach dem
base64-Schema. (siehe Wikipedia)
Schreiben Sie dazu die Umkehrfunktion.

vielleicht auch was dazu sagen wär gut, ich habe kein plan....
 
Zuletzt bearbeitet von einem Moderator:
also generell würde ich erstmal eine funktion schreiben, die einen beliebigen integer wert ins binärformat/oder jedes andere umwandelt und die einzelnen werte in eine geeignete datenstruktur speichern.
wie du von dezimal auf binär kommst habe ich hier beantwortet:http://www.freesoft-board.to/f159/b...er-dezimalzahl-in-eine-binaerzahl-439868.html
damit wäre aufgabe 2 ja schonmal gelöst. in aufgabe 1 kannst du dann wen du die richtige datenstruktur genommen hast z.b ein char array für auch beliebige zeichen invertieren was mit testen gemeint ist weiß ich leider nicht.
zur letzten aufgabe ist eigenlich nur zu sagen, dass wenn du dir den link anschaust du auch das lösen kannst. wenn du dann noch probleme hast kannst du dich ja wieder melden.
ps: es gibt mit sicherheit bessere lösungen aber mir fällt grad nix anderes ein also wenns jemand besser weiß, soll er/sie es posten.
lg der f.o.g.
 
kein PLAN, ich weiss nicht wie ich beginnen soll....

#include

void main(void){


}

int setzebit(int alt,int pos){
int erg;
}

das ist alles was ich in einer Stunde auf die Reihe bekommen habe, oh man.....
 
Zuletzt bearbeitet von einem Moderator:
So, hier erstmal 1 und 2:
PHP:
#include 
#include 

//1a
int set_one(int num, int pos) {
int mask = 1  return num | mask;
}

//1b
int set_zero(int num, int pos) {
unsigned int mask = ~0 ^ (1  return num & mask;
}

//1c
int neg_bit(int num, int pos) {
int mask = (1  return num ^ mask;
}

//1d
int test_bit(int num, int pos) {
int mask = (1  return (num & mask) > 0;
}

//2
void to_bin(int num, char *text) {
text[32] = '\0';
int i;

for (i = 0; i < 32; i++) {
if (num >= (1  else text[i] = '0';
printf("%c",text[i]);
}
printf("\n");

}

//3


int main(void){
printf("%d\n",set_one(2,0));
printf("%d\n",set_zero(3,0));
printf("%d\n",neg_bit(3,0));
printf("%d ",test_bit(4,2)); printf("%d ",test_bit(4,1)); printf("%d\n\n",test_bit(4,0));
char bin[33];
to_bin(4,bin);
printf("\n");

return 0;
}

Base64 muss ich mal googlen, meld mich dann nochmal oder editier es rein, falls noch nicht geantwortet wurde.

Zu 1.) Ich bau mir halt ne passende Maske und maskiere mit bitweise Operatoren. Kann man ja am Beispiel nachvollziehen, hab extra einfache Zahlen genommen.

Bei test_bit gibt er halt zurueck ob an Position pos ne 0 oder ne 1 ist. Und bei pos fange ich an bei 0 zu zaehlen. Und Position 0 ist die Stelle mit dem kleinsten Bit.

Bei 2. nehm ich einfach test_bit fuer die Konvertierung. Dann wird noch 48 draufaddiert, weil die 0 den ASCII Wert 48 hat.

Wenn was unklar ist, konkret fragen.

PS: Wegen math.h musste ich mit gcc -lm kompilieren.

Edit: Ja, rofl, pow ist total dumm, lieber shiften.
 
Zuletzt bearbeitet von einem Moderator:
hey skyte coole lösung allerdings denke ich du solltest ihm nich alles vorkauen . hast ja gesehn dass es bei den basics schon nicht so passt. erstens ein bischen muss man sich da auch einarbeiten damit man es zum schluss kappiert und zweitens muss man da schon seinen eignen stil finden.
muss erstmal los bis dann..
 
Das ist meine Lösung:
Code:
#include 

int setzeeinbitaufeins(int alt,int pos);
int setzeeinbitaufnull(int alt,int pos);
void binaerausgabe(int alt, char *puffer);

void main(void)
{
int zahl=5; //testzahl 1
int position=7; //testposition
int ausgabe; //variable für die ausgabe
int ausgabe2; //variable für die ausgabe2

ausgabe = setzeeinbitaufeins(zahl,position); //funktionsaufruf und ausgabevariable zuweisen
printf("dezi: %04d hexa: %04x adresse: %p zeichen: %c \n\n",ausgabe,ausgabe,&ausgabe,ausgabe); //ausgabe

ausgabe2 = setzeeinbitaufnull(zahl,position); //funktionsaufruf und ausgabevariable2 zuweisen
printf("dezi: %04d hexa: %04x adresse: %p zeichen: %c \n\n",ausgabe2,ausgabe2,&ausgabe2,ausgabe2); //ausgabe

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ab hier binärausgabe : 
//prüfen der binärstellen auf 1 oder 0, rückgabe über den zeiger in das array 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

char *puffer = new char[33];
int neuezahl= -10;
int m;

for(m=0; m {
binaerausgabe(neuezahl, puffer);
printf(puffer);
printf("\n");
neuezahl++;
}

delete [] puffer;
} //main ende

void binaerausgabe(int alt, char *puffer)
{
int n; //zähler
int maske=1; //maske für binärvergleich
int test; //zwischenspeicher für ergebnis 1 oder 0 
for(n=0;n/schleife
{

//test = (alt & maske); //bitweise oder zum vergleich auf 1 oder 0
puffer[31-n]=(alt & maske) ? '1' : '0'; //übergabe von 1 oder 0 in den array durch zeiger puffer
//(test) ? (puffer[n]='1') : (puffer[n]='0'); //mal testen obet klappert
maske = (maske /masken-position über zähler
}
puffer[32] = 0; //endterminierung des puffers
}

int setzeeinbitaufeins(int alt,int pos) //funktion
{
int maske=1; //maske für bitweise oder
maske = (maske /bit in der maske um die angegebene position verschieben 
return alt | maske; //logisches oder ausführen und ausgeben
}

int setzeeinbitaufnull(int alt,int pos)
{
int maske=0; //maske für bitweise und
maske = (maske /bit in der maske um die angegebene position verschieben
return alt & ~maske; //logisch oder ausführen !!!mit negiertem Maskenwert-> da binär 1 hier "durchlässig" ist
}
-------------boh 5Std. jetz dran gesessen, krass!!! YO aber klappt :)
danke trotzdem für die hilfe!!!!



gruß
kaufikaufi
 
Zuletzt bearbeitet von einem Moderator:
Hi Skyte, wenn Du noch die Antwort für base64 ins Forum stellst, dann musst Du aber alles auf Deine Bitoperatoren umstellen. Das wird der Aufgabensteller schon erwarten ...
Der Link zur Wikipedia ist aber schon sehr gut Base64 ? Wikipedia.
Da gibt es sogar Links zu Beispielprogrammen.
 
wasawasa schrieb:
Hi Skyte, wenn Du noch die Antwort für base64 ins Forum stellst, dann musst Du aber alles auf Deine Bitoperatoren umstellen.
Ich hatte auch vor mit Bitoperatoren zu arbeiten.

PHP:
#include 
#include 

//1a
int set_one(int num, int pos) {
int mask = 1  return num | mask;
}

//1b
int set_zero(int num, int pos) {
unsigned int mask = ~0 ^ (1  return num & mask;
}

//1c
int neg_bit(int num, int pos) {
int mask = (1  return num ^ mask;
}

//1d
int test_bit(int num, int pos) {
int mask = (1  return (num & mask) > 0;
}

//2
void to_bin(int num, char *text) {
text[32] = '\0';
int i;

for (i = 0; i < 32; i++) {
if (num >= (1  else text[i] = '0';
printf("%c",text[i]);
}
printf("\n");

}

//3

char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int b64(char c) {
int i = 0;
if (c == '=') return i;
while (c != base64[i]) {
if (i++ > 63) return -1;
}
return i;
}

char *encode64(char *from) {
int tmp;
int flen = -1;
int len, off;
int three, four;
int i = 0;
int j = 0;
int mask;
char *to;

while (from[++flen] != '\0');
len = (flen*4)/3;
len = len + (((flen*4) % 3) > 0);
off = (3 - (flen % 3)) % 3;
to = (char*) malloc((len+off+1)*sizeof(char));

while (len || off) {
tmp = 0;
three = 3;
while (three--) {
if (j < flen) tmp = tmp | from[j++];
if (three) tmp = tmp  }

mask = 0xFC0000;
four = 4;
while (four-- && (len || off)) {
if (len) {
to[i] = base64[(tmp & mask) >> (four*6)];
mask = mask >> 6;
len--;
}
else {
to[i] = '=';
off--;
}
printf("%c",to[i]);
i++;
}

}
to[i] = '\0';
printf("\n");
return to;
}

char *decode64(char *from) {
int tmp;
int flen = -1;
int len;
int three, four;
int i = 0;
int j = 0;
int mask;
char *to;

while (from[++flen] != '\0');
len = (flen*3)/4;
to = (char*) malloc((len+1)*sizeof(char)); 

while (len) {
tmp = 0;
four = 4;
while (four--) {
if (from[j] == '=') len--;
tmp = tmp | b64(from[j++]);
if (four) tmp = tmp  }
mask = 0xFF0000;
three = 3;
while (three-- && len) {
to[i++] = (tmp & mask) >> (three*8);
mask = mask >> 8;
len--;
printf("%c",to[i-1]);
}
}
to[i] = '\0'; 
printf("\n");
return to;

}

int main(void){
printf("%d\n",set_one(2,0));
printf("%d\n",set_zero(3,0));
printf("%d\n",neg_bit(3,0));
printf("%d ",test_bit(4,2)); printf("%d ",test_bit(4,1)); printf("%d\n\n",test_bit(4,0));
char bin[33];
to_bin(4,bin);
printf("\n");

char to64[] = "Fischers Fritz fischt frische Fische.";
char *to_normal;
char *from64;
to_normal = encode64(to64);
from64 = decode64(to_normal);
free(to_normal);
free(from64);
return 0;
}

Also ich lager mir immer jeweils 3 Bytes in einen int ein und lese sie dann entsprechend aus.
 
Zuletzt bearbeitet von einem Moderator:
@ Skyte

sorry aber ich kann mich nicht mit deinem code anfreunden!!!!

p.s. ausserdem heisst der Fritze
 
sorry aber ich kann mich nicht mit deinem code anfreunden! [und noch 20 Ausrufezeichen]
Und nun? Lol. Meine Antworten sind auch nicht dazu gedacht 1zu1 uebernommen zu werden. :rolleyes:
Ich praesentiere hier eine Idee, die beim nachvollziehen zum Denken anregen soll.
Es ist mir auch egal, ob du den Code so uebernimmst. Aber eine fertige Loesung sollte zumindestens dabei helfen eine eigene Loesung zu finden, erst recht wenn sie den eigenen Vorstellungen nicht entspricht.

Im Uebrigen ist es, wie f.o.g. schon sagte, falsch einem was Fertiges vorzukauen.
Wenn du mal konkrete Fragen gestellt haettest anstatt zu sagen "helft mir, ich weiss nix", dann haettest du auch bessere Hilfe erhalten.

Aber anscheinend suchst du nicht nach Hilfe, sondern nach einer fertigen Loesung, und auch nicht nach irgendeiner.
Dann frag ich mich warum du nicht den Code vom Wikipedia Link copy und pastest. :confused:
http://base64.sourceforge.net/b64.c
(Gibt noch zig andere Loesungen im Inet, Google ist dein Freund.)

PS:
ausserdem heisst der Fritze
Noe.

Edit:
p.s. der heisst trotzdem Fritze.
Noe.
 
Zuletzt bearbeitet von einem Moderator:
Was ist an dem Code unfreundlich?
Er ist nicht so hoch optimiert, dass man nichts mehr versteht,
aber doch schön kompakt. Ich finde den Code sehr freundlich.

Aber wenn Du Deine Bedenken ins Forum schreibst, kann man
ja darüber diskutieren.
 
ne Skyte dein Code is schon korrekt, habe gestern um ehrlich zu sein nich ganz durchgeblickt, bin ja noch Anfänger!

p.s. der heisst trotzdem Fritze.

in diesem Sinne

------------------------------CLOSE ME!-----------------------------------------------
 
ne Skyte dein Code is schon korrekt.

p.s. der heisst trotzdem Fritze.
Wie kann der Code korrekt sein, wenn er "Fritze" heisst?
Ich hab schliesslich "Fritz" geschrieben, also muss der Code ja essentiell falsch sein. o0

Ach ja und nochwas:
p.s. der heisst trotzdem Fritze.
Noe. Der heisst so, wie auch immer ich es will, das ist schliesslich nur ein String, aber du bist ja Anfaenger, verstehst du wohl nicht.

PS: Steck dir deinen "Fritze" sonst wo hin.
 
Der Streit um "Fritz" und "Fritze" ist sowieso hinfällig.
Der einzig korrekte String zu Testen von Base64 ist:
"Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark"

So stehts in der Wikipedia. Und die hat immer recht.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten