Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

19.10.2009, 21:58

Bit-Operator (Bitmaske)

Hi Leute!

Also folgendes.
Ich will einen Integer binär darstellen.
Ich hab zwar schon eine Lösung

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
int main() {
    
        // declare our vars

    int counter, user_input, index_counter, negative_positive;
    char *output;
    
        // define our vars

    output = (char*) malloc(sizeof(char) * 32);
    counter = user_input = index_counter = negative_positive = 0;
    
    
    
    printf("Please enter an integer: ");
    scanf("%d", &user_input);
    
    doItFaster(user_input);

        // we need to know if the input is positive or negative 

        // so we can fill our array with 1 or 0

    if(user_input < 0) negative_positive = 1;
    
    for(index_counter = 31; index_counter >= 0; index_counter--)
        output[index_counter] = negative_positive;
    
    
    
    if (negative_positive)
        negative_positive = 0; 
    else 
        negative_positive = 1;
    
    
    index_counter = 0;
    
    
    while(user_input != 0 && user_input != -1) {
        
        if((user_input % 2) != 0) 
            output[index_counter] = negative_positive;
        
        index_counter++;
        user_input = user_input >> 1;
    }
    
    
    for(index_counter = 31; index_counter >= 0; index_counter--) {
        
        if( index_counter == 23 || 
            index_counter == 15 || 
            index_counter == 7  ) printf("|");
        
        printf("%d", output[index_counter]);
    }
    printf("\n");


    
    
    free(output);
    
    return 0;
}



Aber ja, wie ihr seht muss man da ordentlich scrollen...

Meine Frage die ich dazu hätte wäre diese:

mit dem &-Operator vergleiche ich ja Bits.
D.h. wenn ich einen 32Bit-Integer habe der im Moment sagen wir mal den Wert 16 hat, und ich vergleiche ihn mit meiner Bitmaske, die zufällig auch gerade den Wert 16 hat, und ich binde das in eine if-Bedingung

C-/C++-Quelltext

1
2
3
4
bitmask = value = 16;

if(bitmask & value)
 // ...


dann sollte da meines Wissens nach true raus kommen da:

C-/C++-Quelltext

1
2
3
4
5
0000 0000 0000 0000 0000 0000 0010 0000 // bitmask

0000 0000 0000 0000 0000 0000 0010 0000 // value


// soeit ich weiß gilt ja:

0101 & 0011 = 0001


Aber anscheinend hab ich da was falsch verstanden, denn mein Programm funktioniert nicht ^^

Wär nett wenn mir das einer erklären könnte!

Danke,

lG Snooc
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

2

19.10.2009, 22:14

& ist kein Vergleich, sondern das bitweise AND. Auf zwei integrale Operanden angewendet, erhält man als Resultat für jedes Bit 1, wenn beide Operandenbits 1 sind, ansonsten 0.

Hier ein 4-Bit-Beispiel:

Quellcode

1
2
3
   1100
&  1010
== 1000

Somit macht deine If-Abfrage nicht viel Sinn. Du interpretierst dabei den int, der als Resultat von bitmask & value entsteht, implizit als Wahrheitswert (nicht bool in C), wobei jede Zahl ausser 0 als wahr interpretiert wird.

Mehr Informationen erhältst du zum Beispiel bei Wikipedia.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

19.10.2009, 22:15

Ich weiß zwar nicht was die Frage ist aber:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int value = 16; // 10000b

int mask = 16; // 10000b


/**
  00010000
& 00010000
--------------
  00010000 = 16
*/

if ( value & mask ) // ==> if ( 16 )

{
  // ...

}


Und laut 4.12.1 ergibt das true:

C-/C++-Quelltext

1
2
3
4.12 - Boolean conversions [conv.bool]

-1- An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. 


Alternative Lösung:

C-/C++-Quelltext

1
2
for ( int i = 31; i >= 0; --i )
        printf( "%d%s", (bool)(user_input & (1<<i)), (i && ( i % 8 ) == 0 ? "|" : "") );


Oder:

C-/C++-Quelltext

1
2
std::bitset<32> set(user_input);
std::cout << set;

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

4

19.10.2009, 22:33

Re: Bit-Operator (Bitmaske)

Zitat von »"$nooc"«


Also folgendes.
Ich will einen Integer binär darstellen.


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char* argv[]) {
  int mask;
  int foo = 3;
  printf("%d as binary: ", foo);
  for(mask = (1 << 30); 0 < mask; mask >>= 1) {
    printf("%d", mask & foo ? 1 : 0);
  }
  printf("\n");
  return 0;
}


EDIT: sry, hatte davids lösung nicht gesehen.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

19.10.2009, 22:43

Re: Bit-Operator (Bitmaske)

Zitat von »"ChrisJ"«



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char* argv[]) {
  int mask;
  int foo = 3;
  printf("%d as binary: ", foo);
  for(mask = (1 << 30); 0 < mask; mask >>= 1) {
    printf("%d", mask & foo ? 1 : 0);
  }
  printf("\n");
  return 0;
}



Wieso unterschlägst du einfach so das MSB? :shock:

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

6

19.10.2009, 22:47

david: pff... wer braucht so große zahlen schon? ( typo... )
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Werbeanzeige