- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Bitmanipulation: Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    Aus dem obigen "Listing" kommt leider der Datentyp nicht raus. Prinzipiell kann das durchaus sein, das deine Variable auch ein 2 byte Integer ist und kein Byte. Wie sind deine Variable definiert?

    result = ((returnvar << 16) + (lsb_srf << 8 ) + msb_srf);


    würde ich so schreiben:

    Code:
    uint32_t result = returnvar; // convertion to 32 bit
    result = result << 16; // shift by 16 bit and build result
    result |= uint32_t(lsb_srf) << 8; // conversion to 32 bit and shift by 8 bit and build result
    result |= uint32_t(msb_srf); // conversion to 32 bit and build result
    Gruß
    Georg

    EDIT: Code

  2. #2
    Vorher waren alle als uint8_t deklariert. Es funktioniert mit lsb als uint8_t, msb als uint8_t und returnvar als uint32_t. Jetzt ist es deklariert mit lsb als uint8_t, msb als uint16_t und returnvar als uint32_t, damit funktioniert auch alles problemlos.
    Dieser Ausschnitt sieht so aus:

    Code:
    uint32_t getValue(uint8_t adr) 
    {
    	uint8_t lsb_srf = 0;
    	uint16_t msb_srf = 0;
    
    	uint32_t returnvar = 0;
    
    	[herausfinden von msb/lsb (I²C) und returnvar]
    
    	return ((returnvar << 16) | (lsb_srf << 8) | msb_srf);
    }
    und so wird es wieder ,,zerlegt":

    Code:
    gM_srf = getValue(ADDRESS);
    								
    gM_check = ((gM_srf & 0xff0000) >> 16);
    
    if(gM_check == 0)
    {
    	srf10_l = (gM_srf & 0xffff);
            [...]
    }

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    "lsb_srf << 8" funktioniert mit lsb_srf als uint8_t weil die Operation '<<' (wie auch alle anderen Operationen) in C mindestens in int (also hier 16-Bit) durchgeführt wird.

    Nachtrag:
    damit funktioniert auch alles problemlos.
    Obiges bedeutet aber auch, dass das Ergebnis von "lsb_srf << 8" dann signed ist. Probiere deinen Code mal mit einem Wert für lsb_srf bei dem das höchste Bit gesetzt ist, und bestaune dann das Ergebnis.
    Geändert von sternst (02.01.2013 um 16:49 Uhr)
    MfG
    Stefan

  4. #4
    Danke, nun hab’ ich es verstanden!

Ähnliche Themen

  1. problem mit bitmanipulation
    Von _maddin im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.07.2008, 23:37
  2. Bitmanipulation
    Von raoul4 im Forum Assembler-Programmierung
    Antworten: 6
    Letzter Beitrag: 03.04.2007, 12:54
  3. Anschlussbelgung anpassen mit Bitmanipulation
    Von waldi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.12.2006, 12:04
  4. Bitmanipulation in ASM
    Von teslanikola im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 11.04.2006, 12:19
  5. Bitmanipulation
    Von teslanikola im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 29.08.2005, 20:28

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests