[C++] fehler einbauen

Alida

Newbie
Registriert
Apr. 2005
Beiträge
4
hallo..

sorry ich bin ziemlich eine anfängerin:
ich möchte einen programm schreiben der folgendes macht:

wenn ich 2 zahlen habe x und y:

x= 4 = 0100 und y=5=0101

dieses programm soll nach einer bestimmt wahrscheinlichkeit q einige bits von x und y ändern und so sie fälschen und dann diese addieren:

zB
wenn q= 0.01 dann aus x=0101 machen und aus y=1101 und dann z=x+y=0101+1101.


hat jemand eine idee? ich wäre euch sehr dankbar :freak:
 
Re: fehler einbauen

welche sprache willst du nutzen?
und rein interessehalber (hab grad stochastik) wozu soll das programm sein?
 
Re: fehler einbauen

das soll in C++ programmiert werden..

das ganze dient einer fehlertoleranz architektur..
 
Re: fehler einbauen

Erklär mal bitte ein wenig, was Du mit der Wahrscheinlichkeit meinst.
So eine Zahl hat ja z.B. 32-Bit maximal. Oder wieviel hättest Du gern?
Je nachdem was man da kippt, kommt ja noch was ganz anderes raus.
 
Re: fehler einbauen

hallo

1-die anzhal der bit ist glaube ich nicht wichtig weil man danze ganze mit einer schleife machen könnte oder?

iich würde es mal mit 4 bits versuchen..

2- es ist genau der sinn dass es durch diese bitänderung sich eine ganze zahl sich ergeben könnte?

3- mit der wahrscheinlichkeit ist gemeint das ich halt eine wahrscheilichkeit p habe und wenn diese eingetroffen wird..wird einfach ein bit geändert.


ich weiss dass sind viele wünsche in einem Programm..deswegen komme ich nicht weiter, weil ich auch eine anfängerin bin.
 
Re: fehler einbauen

Naja.. wir nähern uns langsam an :)

Wieviele Bits sollen denn gekippt werden? Nur eines? Oder mehrere? Und falls mehrere, gibt es da auch ein bestimmtes Schema hinter?

Nochmal meine erste Frage neu formuliert... wie sieht der Wertebereich der Eingabe-Werte aus? Und in welchem Wertebereich soll dann das Ergebnis sein?

Hast Du denn schon ein wenig versucht, etwas zu programmieren? Poste das doch einfach mal, dabei können Dir bestimmt noch viele Verbesserungsvorschläge geben :)

Gruß
 
Re: fehler einbauen

Moin,
ich hab mir die Beschreibung jetzt ein paar mal durchgelesen aber so wirklich schlauch bin ich immer noch nicht ich versuchs aber mal. Soweit ich dich jetzt verstanden habe möchtest du bei einer beliebigen binären Zahlenfolge mit der Wahrscheinlichkeit q=0,01 ein Bit verändert wird.
Was ich jetzt nicht verstehe, soll das eine Einbitänderung sein oder werden mehrere Stellen verändert. Und gilt das sowohl für x als auch für y oder werden beide Variablen seperat betrachtet (wenn x geändert, muss nicht zwangsläufig auch y geändert werden)?
 
Re: fehler einbauen

ja genau..

es soll nur ein bit geändert werden..welcher das ist, ist egal..
es sollen sowohl x als auch y geändert werden..die müssen aber nicht zwangsläufig beide geändert werden.


danke
 
Re: fehler einbauen

Code:
if(!rand()%100){
    int a = rand()%3;
    switch(a){
        case 0:
             changerandombit(x);
             break;
        case 1:
             changerandombit(y);
             break;
        case 2:
             changerandombit(x);
             changerandombit(y);
             break;
    };
}

das erstmal zum grundsätzlichen aufbau
der if-körper wird ausgeführt wenn der rest der division durch 100 0 ist (man hätte auch = ne zahl schreiben können) dann werden eine oder beide zahlen etwas verändert
ich weiss allerdings atm nicht wie man ein bestimmtes bit einer variable ändert also müsste da mal jemand anderes helfen die funktion zu basteln
 
Re: fehler einbauen

Code:
/* Die Funktion toggled das Bit mit der Nummer [I]bitNr[/I] in der Zahl [I]zahl[/I].
 * [I]bitNr[/I] darf nur die Werte 1 bis 31 annehmen (wenn int 32 Bit groß ist), sonst krachts. */

int toggleBit( int bitNr, int zahl)
{
    /* if Bit hat den Wert 1 */
    if( zahl & (0x01<<bitNr) )
    {
        zahl = zahl & (~(0x01<<bitNr)); /* Bit auf 0 setzen */
    }
    else
    {
        zahl |= zahl & (0x01<<bitNr); /* Bit auf 1 setzen */
    }

    return zahl; /* enthält zahl mit gekippten Bit */
}
Ich bitte aber darum die Funktionalität dieser Funktion zu durchdenken und zu testen:
& ist ein "bitweises UND"
<< Bitshift left
~ bitweises NOT
| bitweises OR
 
Re: fehler einbauen

Boron schrieb:
Code:
...

int toggleBit( int bitNr, int zahl)
{
    /* if Bit hat den Wert 1 */
    if( zahl & (0x01<<bitNr) )
    {
        zahl = zahl & (~(0x01<<bitNr)); /* Bit auf 0 setzen */
    }
    else
    {
        zahl |= zahl & (0x01<<bitNr); /* Bit auf 1 setzen */
    }

    return zahl; /* enthält zahl mit gekippten Bit */
}
...

also so einen Aufwand mußt du gar nicht betreiben, es würde auch folgendes reichen:
Code:
/* gültige Werte für bitNr sind 0 bis 31 */
unsigned int toggleBit( unsigned int bitNr, unsigned int zahl) {
    return zahl ^ ( 1 << bitnr );
}

oder als Makro:

#define toggleBit( bit, val ) ( (val) ^ ( 1 << (bit) ) ) 

ein Aufruf könnte dann z.B. so aussehen:

...
unsigned int GetChanged ( unsigned int x, unsigned int y, unsigned int q ) {
    if ( !(rand() % q) ) {
        x = toggleBit( rand() % 32, x );
    }
    if ( !(rand() % q) ) {
        y = toggleBit( rand() % 32, y );
    }

    return x + y;   
}

...
srand( time( NULL ) );
printf("z = %i", GetChanged( x, y, 100 );
...

so könnte es aussehen, dass ganz soll jetzt auch mehr ein grobes gerüst als fertiges programm sein
 
@agent
Du hast recht.
Die XOR Operation habe ich völlig vergessen. Die ist viel besser geeignet als meine lange Funktion.
 
Zurück
Oben