Zwei char-Arrays bitweise addieren?
-
Hi Leute!
Wie schlagt ihr vor, wie man zwei char-Arrays bitweise addieren könnte? Ich zerbrech mir da jetzt schon eine ganze Weil den Kopf darüber, komme aber zu keinem Entschluss. Könnt ihr mir helfen?
-
Wozu Bitweise? Meintest du vielleicht Byteweise?
-
Meine Aufgabe lautet aber addBitVector... Damit soll ausgedrückt werden, dass die char-Arrays, quasi BitVektoren sind. Ich soll somit auch richtig binär addieren... Das macht die Sache schon unheimlich kompliziert... Das ist eine Übungsaufgabe. Wie gesagt, ich weiß echt nicht so recht wie das gehen soll!
-
C addiert eh bitweise richtig.
int main(void) { char array1[30]="abcd"; char array2[30]="efgh"; printf("%d\n",array1[0]+array2[0]);//198 (97(a)+101(e)) return 0; }
Wenn du ein einzelnes char zeichen mit einem anderen addiertst, werden deren integerwerte addiert.
1 char ist 8Bit auf einer 32 Bit Maschine.
Hoffe das hat geholfen.
-
char a[]="\1\0\1\0\1"; char b[]="\1\1\0\1\0"; char c[sizeof a]="",i=sizeof a; while( i-- ) { c[i+1]+=a[i]+b[i]; c[i+1]&2?c[i]=1,c[i+1]&=1:0; } i=sizeof c; while( i-- ) c[i]+='0'; fwrite(c,sizeof c,1,stdout);
-
Hallo Wutz!
Ich weiß, dass es schon etwas her ist aber vielleicht kannst du mir doch nochmal helfen. Ich hab deinen Quellcode-Schnipsel genommen und mal an meine Umgebung versucht anzupassen. Die Berechnugn die hier gemacht werden soll, soll in einer Funktion von statten gehen, deren Bitvectoren aus einer Struktur kommen. Hier mal der etwas veränderte Code:
struct bitvector *addBitVector(struct bitvector *s1, struct bitvector *s2, unsigned int anzahl) { bitvector ergebnis; createBitVector(&ergebnis, anzahl); char ergebnis[sizeof s1]="", i=sizeof s1; while(i--) { ergebnis.bits[i+1] = ergebnis.bits[i+1] + (s1->bits[i]+s2->bits[i]); ergebnis.bits[i+1]&2?ergebnis.bits[i]=1,ergebnis.bits[i+1]&=1:0; } i=sizeof ergebnis; while(i--) { ergebnis.bits[i] = ergebnis.bits[i] + '0'; } fwrite(&ergebnis, sizeof ergebnis, 1, stdout); }
Die Funktion die hier innerhalb verwendet wird, erstellt einen Bitvectoren mit angegeben Anzahl an Bits. Bei anzahl = 16 (z.B.) bekommt man eben einen Bitvector mit 2 Elementen zurück. Dieser Bitvector ist dann komplett auf 0 gestzt. In den Bitvector s1 und s2 die per Pointern an die Funktionen übergeben worden sind, steht quasi die Zahl die addiert werden soll. Ich hab nun noch ein Problem. Wenn ich meinen Code nun ausführe, dann meckert der Compiler, dass in der Zeile "char ergebnis[sizeof s1]="", i=sizeof s1;" in Bezug auf die vorgenommenen Dereferenzierungen nicht passt. Ich hab jetzt schon alles mögliche ausprobiert aber nix hat funktioniert.
Könnt ihr mir sagen woran das liegt?
Edit:
Mit der Bedeutung von "ergebnis.bits[i+1]&2?ergebnis.bits[i]=1,ergebnis.bits[i+1]&=1:0;" weiß ich grad auch nix anzufangen. Bis zum =1 verstehe ich das ganze schon. Was aber macht das "," bzw. der ganze Rest ab dem Komma?
Edit 2:
Was macht die Zeile "char ergebnis[sizeof s1]="", i=sizeof s1;"? Da werd ich auch nicht so schlau draus...
-
Beweise deinem Lehrer, dass das Ergebnis einer Addition unabhängig vom Zahlensystem ist. Dann addierst du deine Zahlen im 256-System (sprich: indem du die chars addierst).
-
Beweise deinem Lehrer, dass das Ergebnis einer Addition unabhängig vom Zahlensystem ist. Dann addierst du deine Zahlen im 256-System (sprich: indem du die chars addierst).
Danke für deine Antwort, SeppJ!
Aber: Es beantwortet keinerlei meiner eigentlich gestelletn Fragen...
-
Deine Anpassungen werden so nicht laufen.
Mein o.g. Beispielcode addiert 2 char Arrays, die nur mit 0 oder 1 gefüllt sein dürfen und eine bestimmte Länge haben. Das für die Addition niederwertigste "Bit" steht am Ende des jeweiligen char Arrays, d.h. bei char a[4] steht es bei a[3].
Im Ergebnisarray stehen die Bits sinnigerweise ebenso angeordnet, auch ist dieses 1 Byte größer dimensioniert.
Du solltest als erstes mal die Bitreihenfolge aus deinem Fall und meinem Beispiel auf Übereinstimmung abklären, außerdem redest du von "Zahlen" und die gibt es bei diesem Beispiel nicht.
Sinnvoll wäre eine Additionsfunktion aus o.g. Beispiel, z.B.char *addiereBitsAusArrays(const char *x,size_t groessex,const char *y,size_t groessey,char *z,size_t groessez) { ... s.o. return z; }
und der Aufruf dann z.B.
char a[5]="\1\0\1\0\1"; char b[5]="\1\1\0\1\0"; char c[6],*ergebnis; int i; ergebnis = addiereBitsAusArrays(a,5,b,5,c,6); i=sizeof c; while( i-- ) c[i]+='0'; fwrite(c,sizeof c,1,stdout);
Den Zugriff innerhalb deiner Strukturen musst du schon selbst regeln und durchschauen.
-
Ich verstehe die gestellte Aufgabe nicht voll. Char-Arrays in C sind Bytes mit 256 darstellbaren ASCII-Zeichen. Wozu noch der Zugriff auf Bits?
-
da sind einige bugs drin, z.b.:
char ergebnis[sizeof s1]="";
überleg dir doch mal den unterschied zwischen sizeof(s1) und sizeof(*s1).
ich vermute mal, die zweite variante ist diejenige, die du möchtest.
also char ergebnis[sizeof *s1]={0};desweiteren, was ist, wenn in der struktur noch weitere variablen deklariert sind? dann wird die anzahl der reservierten bytes des aufrufs
char ergebnis[sizeof s1]="";
bzw.
char ergebnis[sizeof *s1]="";
vermutlich nicht die anzahl der bytes sein, die du reservieren möchtest; nämlich
im ersten fall zu wenige und im zweiten zu viele bytes.naja und warum versuchst du nicht selbst mal ein kleines programm zu schreiben(stift und zettel sowie google sind dabei gute hilfsmittel),
welches du lesen und verstehen kannst, anstelle reverse engeneering von schlecht lesbarem und schlecht nachvollziehbarem hack anderer zu betreiben?berniebutt schrieb:
Ich verstehe die gestellte Aufgabe nicht voll. Char-Arrays in C sind Bytes mit 256 darstellbaren ASCII-Zeichen. Wozu noch der Zugriff auf Bits?
hat er doch beschrieben, die char arrays sollen bitvektoren darstellen, d.h. in jedem char steht ein bit drin, wenn ich das richtig verstehe.
-
hallo bb! kannst du mal bitte ein beispiel zeigen?
-
bolchen schrieb:
hallo bb! kannst du mal bitte ein beispiel zeigen?
ja, kann ich
kannst du mal deinen ansatz zeigen?