2017-06-17 3 views
-2

gleich Wenn ich eine Variable wie dieseC++ Überprüfen Sie, ob etwas zu etwas

int A = 0x00203450; 

haben, wie würde ich prüfen, ob der Wert 3 gesetzt ist? So überprüft ich mich, ob die 3 hier ist

0x0020 -> 3 <- 450 

Ich habe versucht, diese

if((A & 0x00003000) == 0x00003000) 
{ 
    _sys_print("the 3 value is set") 
} 

Und ein paar andere Dinge, keine zu funktionieren scheint. Irgendwelche Vorschläge?

+0

aussehen wie ein [XY Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Stargateur

+0

Können Sie bitte einige Beispiele für Werte angeben, bei denen der Test wahr ist, und andere, bei denen der Test falsch ist? Eigentlich denke ich, dass dein '(A & ...)' -Ansatz funktionieren sollte. –

+1

@StephanLechner '0xFFFF' return true aber sollte es keine' 3' geben – Stargateur

Antwort

2

Das Problem ist, dass eine Position in einer Hex-Darstellung wie ein einzelne F oder Ihre einzelnen 3 ein Nagen von 4 Bits repräsentiert (oder einen „Halbbyte“ in Ihren Worten).Wenn ich dich richtig verstehe, dann willst du überprüfen, ob das vollständige "Nibble" genau 3 ist, d.h. 0011b. Dann wird das Problem mit dem Ausdruck A & 0x00003000 ist, dass es „Schnitt“ entfernt die ersten beiden Bits des knabbern von Interesse so groß, daß eine Eingabe an dieser Stelle sein könnte 1111b oder 1011b oder 0111b oder 0011b und A & 000003000 würde immer 0011 geben an dieser Stelle.

Also sollten Sie schreiben (A & 0x0000F000) == 0x00003000), so dass Sie tatsächlich das gesamte Nibble und nicht nur die niedrigsten zwei Bits davon testen. Sehen Sie sich den folgenden Code an, der diesen Ansatz veranschaulicht. Ich hoffe es hilft.

int main() { 

    int test[] = { 0x00203450, 0x00202450, 0x00207450, 0x0020F450, 0x00200450, 0 }; 

    for (int* t=test; *t; t++) { 
     const char* result = ((*t & 0x0000F000) == 0x00003000) ? "true" : "false"; 
     printf("%08X contains the 3: %s\n", *t, result); 
    } 
    return 0; 
} 
1

Ich laufe deinen Code und es funktioniert gut für mich.

#include <stdio.h> 

int main(void) 
{ 
    int A = 0x00203450; 

    if((A & 0x00003000) == 0x00003000) 
     puts("3 is there"); 

    return 0; 
} 

druckt, dass 3 dort ist. Sind Sie sich über die Funktion _sys_print() sicher?

Edit: versuchen

if((A & 0x0000F000) == 0x00003000) 

Diese 0x0000 < was A hat hier bekommen> 000 und sehen, ob es sich um eine int

0

Eine ganze Zahl 3 ist eine Integer-Variable. Wenn Sie mit 0x00203450 initialisieren, wird die endgültige Darstellung nicht in diesem Format aber in Binär 0b1000000011010001010000‬ sein. Deshalb existiert ein binärer Operator, um Bits einer Variablen zu manipulieren.

Das heißt, Sie möchten wissen, ob es eine Zahl 3 in Ihrer Nummer gibt. Dazu müssen Sie Ihre Variable als hexadezimale manipulieren:

Sie so etwas tun könnte:

#include <iostream> 

int main(void) { 
    int n = 0x00203450; 
    if (n/16/16/16 % 16 == 3) { 
     std::cout << "There is a 3\n"; 
    } 
} 

A Pampe schnellere Lösung:

#include <iostream> 

int main(void) { 
    int n = 0x00203450; 
    if ((n & 0xF000) == 0x3000) { 
     std::cout << "There is a 3\n"; 
    } 
} 

Der Trick mit Binäroperators nur für Basiszahl arbeiten Vielfaches von 2, wie (4, 8 und 16).

Beispiel für Oktal:

#include <iostream> 

int main(void) { 
    int n = 0342; 
    if ((n & 0700) == 0300) { 
     std::cout << "There is a 3\n"; 
    } 
} 
+0

Kannst du bitte klarstellen auf "Du kannst kein Binärformat manipulieren und versuchen, nach einer hexadezimalen Ziffer zu suchen, ohne sie vorher in hexadezimale umzuwandeln"? –

+0

int ist eine Ganzzahl, die Sie nicht ganzzahlig in Binär oder irgendeine andere Darstellung konvertieren können, da die Ganzzahl abstrakter ist als die Darstellung selbst. Was Sie tun können, ist die Arbeit an einer binären Darstellung, aber Sie müssen nichts konvertieren, um dies zu tun. – Logman

3

Wenn ich Ihre Frage richtig verstanden habe, das alles ist, was Sie brauchen:

if((A & 0x0000F000) == 0x00003000) 
{ 
    _sys_print("the 3 value is set") 
} 
+0

Danke für die Antwort! Perfekt funktioniert – reflexdev

2

Basierend auf einer weiteren Klärung in einem Kommentar die Antwort zu sein scheint:

(a & 0x0000F000) == 0x00003000 

Das wählt die viert niedrigste hexadezimale Ziffer aus und prüft, ob es '3' ist. Betrachtet man also dieses Nibble allein im Binärformat, so wird es mit "0011" übereinstimmen, aber nicht mit "0111".

Hier ist ein kleiner Test Kabelbaum.

#include <stdio.h> 
#include <stdbool.h> 

bool isThree(int a){ 
    return (a & 0x0000F000) == 0x00003000; 
} 

int check(int a,bool expect){ 
    if(isThree(a)==expect){ 
     return 0; 
    } 
    printf("ERROR: isThree(%x)!=%c\n",a,(expect?'T':'F')); 
    return 1; 
} 

int main(void) 
{ 
    int errors=0; 
    errors+=check(0x00003000,true); 
    errors+=check(0x00004000,false); 
    errors+=check(0x0000F000,false); 
    errors+=check(0x00000000,false); 
    errors+=check(0xABCD3123,true); 
    errors+=check(0xABCD7123,false); 

    if(errors!=0){ 
     printf("ERRORS: %d\n",errors); 
    }else{ 
     printf("Success\n"); 
    } 
    return 0; 
} 
Verwandte Themen