PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c Problem: Right shift >> macht nicht was es soll...oder doch?


Matrix316
2004-11-10, 14:41:43
Also ich hab ein kleines Testprogramm gemacht:


#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <math.h>


void main(void)
{

int i;
char zeichen = 'a';
char help;

for(i=0; i<8; i++);
{
help=zeichen>>i;
printf("help: %d %d\n",help,zeichen);
}

return;
}


Als Ausgabe kommt:


help: 0 97
Press any key to continue


Warum kommt nur eine Zeile? Müssten nicht 7 kommen?

EDIT:hat sich erledigt, das Semikolon nach dem for(...) war der Fehler ;)

Naja, vielleicht brauch ich den Thread noch ;);)

Crushinator
2004-11-10, 15:05:36
Muahaha! ;D

Wegen eines ähnlichen Semikolons habe auch ich schon mal an meinen Verstand gezweifelt, zumal der Debugger von Visual C++ die Schleife auch in Deinem Fall nicht in einzelnen Schritten durchgehen sondern gleich i=8; daraus machen dürfte. Seit dem habe ich mir gemerkt, daß wenn der Zähler im Debugger sofort auf den höchten Wert springt, ein Semikolon zuviel exisitieren dürfte.

Matrix316
2004-11-10, 15:06:16
Frage: Wie kann ich auf den Binären Wert einer int Variable (oder char) zugreifen?

Also quasi wenn int test = 5;

und ich möchte gerne abfragen: if (test == 101)...;

Crushinator
2004-11-10, 15:32:00
Was genau möchtest Du machen? Schauen ob z.B. Bit 3 an oder aus ist, oder brauchst Du einen generellen "Binary to Dec" Parser/Übersetzer? Letzteren kann ich nämlich nicht in paar Zeilen und nur aus dem Kopf beschreiben.


int i = 5;

if (i & (1 << 2)) /* Wenn das 3. Bit an ist ... */
Bit3IstAn = true;

Matrix316
2004-11-10, 16:01:47
Also ich will/soll eine Paritätsberechnung machen. Ich bekomm ein Zeichen und soll prüfen ob ein Paritätsbit gesetzt werden soll. Das habe ich mir so gedacht:


int parity( char zeichen ) {

int i;
char zeichen_neu;
int count=0;


for(i=7; i>=0; i--)
{

zeichen_neu = zeichen;

zeichen_neu = zeichen_neu >> i;


if (zeichen_neu==1)
{
count++;
//printf("Count: %d\n",count);


}

//printf("%c \n",zeichen_neu);

zeichen_neu = zeichen_neu << i;

zeichen = zeichen-zeichen_neu;

}



if (count%2==1) //wenn ungerade ist
{
return 0;
}
else return 1;
}


EDIT: Das Problem ist, wenn ich das so einbaue, dann hört er nicht mehr auf und der count Wert ist immer der gleiche...

Matrix316
2004-11-10, 16:30:38
Was genau möchtest Du machen? Schauen ob z.B. Bit 3 an oder aus ist, oder brauchst Du einen generellen "Binary to Dec" Parser/Übersetzer? Letzteren kann ich nämlich nicht in paar Zeilen und nur aus dem Kopf beschreiben.


int i = 5;

if (i & (1 << 2)) /* Wenn das 3. Bit an ist ... */
Bit3IstAn = true;


hmmmmm...der Code bringt mich auf eine Idee:



for(i=0; i<8; i++)
{
if (zeichen & (1 << i) == true (oder 1) )
{count++}
}



ich probiers mal...:)

Matrix316
2004-11-10, 16:53:10
Also obs 1 ist sollte man nicht testen, hab ich festgestellt, sondern ich hab einfach jetzt getestet ob es nicht 0 ist. Jetzt scheint es zu funktionieren. ;)



int parity( char zeichen ) {
/* Hier muss die Paritaetsberechnung eingefügt werden */
int i;

int count=0;



for(i=0; i<8; i++)
{
if ((zeichen & (1<<i))!=0)
{
count++;
}
}

printf("\n count: %d\n",count);

if (count%2==1) //wenn ungerade ist
{
return 0;
}
else return 1;
}

Crushinator
2004-11-10, 17:15:14
Deswegen schrieb ich "if (i & (1 << 2)) { ... }", was auf dasselbe hinausläuft, denn

int i = 6;
char c = 'a';
printf("%d", c & (1 << i));
... dürfte 64 oder so ergeben, was logisch trotzdem true/TRUE entspricht. ;)

Matrix316
2004-11-10, 23:16:02
Aber es gibt eine Warnung von wegen "unsichere Kombination von Typ 'int' mit Typ 'const bool' in einer Operation" oder so. ;)

maximAL
2004-11-10, 23:20:19
hab mir den source jetzt nicht so genau durchgelesen, aber es gibt doch so nette sachen wie bitfields...

Matrix316
2004-11-10, 23:42:39
Und wie kombiniere ich bitfields mit einzelnen zeichen, so dass ich quasi zugriff auf jedes einzelne Bit des Zeichens hätte und was unterscheidet es dann von einem normalen array oder so? :confused:

Gibts eigentlich eine Möglichkeit die Bits auch als einzelne Bits zu behandeln und nicht die Wertigkeit der Stelle?

EDIT: OK, ich hab mal eine etwas abenteuerliche Konstruktion gemacht, so dass ich alle Bits eines Zeichens jeweils in einen array bekomm. Aber gibts keine einfachere Möglichkeit? :uponder:


int a;

char zeichen='f';

int c[8];

c[0]=(zeichen&(1<<7))>>7;
c[1]=(zeichen&(1<<6))>>6;
c[2]=(zeichen&(1<<5))>>5;
c[3]=(zeichen&(1<<4))>>4;
c[4]=(zeichen&(1<<3))>>3;
c[5]=(zeichen&(1<<2))>>2;
c[6]=(zeichen&(1<<1))>>1;
c[7]=(zeichen&(1<<0))>>0;


for(a=0; a<8; a++)
{
printf("%d",c[a]);
}

maximAL
2004-11-11, 10:14:34
Und wie kombiniere ich bitfields mit einzelnen zeichen, so dass ich quasi zugriff auf jedes einzelne Bit des Zeichens hätte und was unterscheidet es dann von einem normalen array oder so? :confused:

so wie ich das sehe, kann man die einzelnen bits leider nicht als array ansprechen, also
struct bf
{
bool a[32]:1;
};
geht wohl leider nicht. man müsste also jedes bit mit einem eigenen namen versehen, zb.
struct bf
{
bool a:1;
bool b:1;
//...
bool z:1;
};
was natürlich alles andere als komfortabel ist.

littlejam
2004-11-11, 13:21:18
Wie wäre es denn einfach mit einem bool-feld?

#include <iostream>
#include <math.h>
using namespace std;

int main(void){

int test=5;
int bitcount=8;
bool* bin = new bool[bitcount-1];

for(int i=bitcount-1;i>=0;--i){
if(test-pow(2.0,i)>=0){
test-=pow(2.0,i);
*(bin+i)=1;
}
else{
*(bin+i)=0;
}
}

for(int i=bitcount-1;i>=0;--i)cout << *(bin+i);

cout << endl;
system("pause");
return 0;}


edit: shiften ist da evtl. ein bisschen effektiver, na und :D

Gruß

Crushinator
2004-11-11, 14:32:52
Aber es gibt eine Warnung von wegen "unsichere Kombination von Typ 'int' mit Typ 'const bool' in einer Operation" oder so. ;) OMG, welcher Compiler meckert das denn an?

Oder hast Du explizit auf true á la "if ((zeichen & (1<<i))==true)" geprüft?

Matrix316
2004-11-11, 19:40:29
OMG, welcher Compiler meckert das denn an?

Oder hast Du explizit auf true á la "if ((zeichen & (1<<i))==true)" geprüft?
M$ Visual C++ 6 Enterprise Edition ;)

Matrix316
2004-11-11, 19:42:00
Wie wäre es denn einfach mit einem bool-feld?

#include <iostream>
#include <math.h>
using namespace std;

int main(void){

int test=5;
int bitcount=8;
bool* bin = new bool[bitcount-1];

for(int i=bitcount-1;i>=0;--i){
if(test-pow(2.0,i)>=0){
test-=pow(2.0,i);
*(bin+i)=1;
}
else{
*(bin+i)=0;
}
}

for(int i=bitcount-1;i>=0;--i)cout << *(bin+i);

cout << endl;
system("pause");
return 0;}


edit: shiften ist da evtl. ein bisschen effektiver, na und :D

Gruß


Das mit BOOL ist mir heute Mittag auch mal eingefallen. :wink: