Bedingte Prüfung auf „i == (2^8)“ schlägt fehl, wenn i 512 ist?

Lesezeit: 2 Minuten

Benutzer-Avatar
Sandeep

Hier ist ein kleines Programm zum Drucken von Potenzen von 2 bis 8. Aber es beendet sich nicht nach 8. Bitte erklären Sie den Grund.

#include <stdio.h>
#include <unistd.h>
int main(void)
{
        unsigned int i=1;
        while(1) {
                i = i<<1;
                printf("i = %d\n",i);
                if(i==(2^8))
                        break;
                sleep(1);
        }
        printf("Exited While loop.. \n");
        return 0;
}

Die Schleife wird nicht verlassen, wenn i = 2^8 ist. Meine Ausgabe sieht in etwa so aus:

i = 2
i = 4
i = 8
i = 16
i = 32
i = 64
i = 128
i = 256
i = 512 (Should have Exited here. But the program is continuing. Why?)
i = 1024
i = 2048
i = 4096....

BEARBEITEN :

Danke für die Antwort, dass ^ ein XOR-Operator ist. Aber jetzt verhält sich der folgende Code seltsam. Bitte erkläre.

#include <stdio.h>
int main(void)
{
        if((2)^8 == 1<<8) {
                printf("True.. \n");
        } else {
                printf("False..!!");
        }
        return 0;
}

Das obige Funktionsprogramm gibt wahr aus.

  • Da es anscheinend alle nicht erwähnt haben, notiere ich es hier: in Sprachen, die es unterstützender Standardoperator zur Potenzierung ist das doppelte Sternchen, z. B. 28, 73 usw…

    – Thomas

    23. Juli 2012 um 12:00 Uhr


  • @Thomas Danke. Aber in C zeigt es einen Syntaxfehler.

    – Sandeep

    23. Juli 2012 um 12:05 Uhr

  • C ist keine dieser Sprachen. Es ist nur ein Bonus, falls Sie auf eine Sprache stoßen, die dies tut (Python, einige Pascal-Dialekte, vielleicht Java?)

    – Thomas

    23. Juli 2012 um 12:10 Uhr


  • In einigen Dialekten von Basic war ^ der Potenzierungsoperator. Ich kann mich jedoch nicht erinnern, es in anderen Sprachen gesehen zu haben.

    – Ferruccio

    23. Juli 2012 um 12:38 Uhr

  • +1 für eine häufig gestellte Frage, die den gesamten relevanten Quellcode und Beispiele für fehlerhafte Ausführung enthielt. Aber im Allgemeinen ist die Bearbeitung genau auf der Linie, wo es vielleicht besser gewesen wäre, eine neue Frage zu dem Rätsel zu stellen, da es wirklich keine Klärung ist Dies Frage.

    – RBerteig

    23. Juli 2012 um 18:53 Uhr

Benutzer-Avatar
Guy Adini

In C bedeutet der Operator ^ XOR (bitwise exclusive or).

Um 2 hoch 8 zu erhalten, müssen Sie entweder eine Schleife verwenden (res *=2 in einer Schleife) oder die pow-Funktion in math.h runden (beachten Sie, dass die math.h-Funktion Float zurückgibt – und daher gewinnt’ t gleich der ganzen Zahl sein).

Die einfachste Methode ist natürlich die bitweise Verschiebung.

Über den Bearbeitungsbereich:

Willkommen in der wunderbaren Welt von Operator Vorrang. Was passiert ist, dass == einen höheren Vorrang als ^ hat und daher die Bedingung zu 2^0 ausgewertet wird, was 2 ist, was wahr ist.

Damit es funktioniert, müssen Sie Klammern hinzufügen:

if ( (2^8) == (1<<8) ) ...

  • Bitte schauen Sie sich meinen Abschnitt Bearbeiten in der Frage an.

    – Sandeep

    23. Juli 2012 um 7:21 Uhr

  • Vielen Dank. Es ist jetzt klar. Aber warum hat es 2 ^ 0 bewertet? selbst wenn es 2 ^ 0 ist, was 2 ist, wie gibt es 1 zurück, wenn es mit 1 verglichen wird?

    – Sandeep

    23. Juli 2012 um 7:35 Uhr

  • Nein nein, 8 == (1<<8) zu 0 ausgewertet, was dann mit 2 xored wurde, was zu 2 ausgewertet wurde. WAHR...".

    – Guy Adini

    23. Juli 2012 um 7:37 Uhr

  • “Beachten Sie, dass die Funktion math.h Float zurückgibt – und daher nicht gleich der Ganzzahl ist” Nein, pow(3) gibt ein Double zurück und ist daher für den gesamten Bereich einer 32-Bit-Ganzzahl (und die meisten auch einer 64-Bit-Ganzzahl) genau richtig.

    Benutzer79758

    23. Juli 2012 um 9:39 Uhr

Benutzer-Avatar
Felice Pollano

Das Problem ist, dass ^ ist der Bitweises XOR Betreiber, nicht an die Macht zu bringen. Lassen Sie uns erklären 2^8 im bitweisen Format:

2 = 0010
8 = 1000
======== xor
10= 1010

Das Ergebnis, wenn xor Bit für Bit angewendet wird, ist also 10, das passiert nie, sodass Ihre Schleife nie beendet wird. Sie können Ihren Komponententest zum Laufen bringen, wenn Sie verwenden pow(2,8) und stattdessen auf Ganzzahl runden.

Eine weitere Information, es ist in diesem Beispiel wahrscheinlich nicht der Fall, aber es ist besser, die strikte Gleichheit zu vermeiden, wenn Sie mit Gleitkommawerten arbeiten, vergleichen Sie besser mit einem Epsilon.

Für deine Bearbeitung:
Stellen Sie damit den Vorrang sicher:

if((2^8) == (1<<8))

dies wird wie erwartet false zurückgeben.

2^8 ist 2 XOR 8, dh. 10, nicht 256. Daher stoppt Ihre Schleife nicht. Sie möchten wahrscheinlich gegen beides prüfen (1<<8) oder 256 speziell.

Benutzer-Avatar
Witzbold

^ ist keine Macht in c, heißt es XOR. 2^8==10 und es wird in diesem Code nicht gleich i sein.

^ ist bitweises XOR, die gesuchte Funktion ist pow in math.h 🙂

Benutzer-Avatar
Jitendra

Für Ihren Bearbeitungsabschnitt

#include <stdio.h>
int main()
{
        if((2^8) == (1<<8)) {
                printf("True.. \n");
        } else {
                printf("False..!!");
        }
        return 0;
}

Es wird zurückkehren FALSCH.

1144740cookie-checkBedingte Prüfung auf „i == (2^8)“ schlägt fehl, wenn i 512 ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy