2bit Variablen

Gast #1372894
Ich arbeite gerade an einem realtiv speicherintensiven Programm. Daher 
bin ich bestrebt, den Code soweit als möglich zu schrumpfen. Das 
Programm verarbeitet hauptsächlich Variablen mit den Werten 0,1,2 oder 
3, also im Grunde 2bit. Ist es möglich eine Variabel so zu deklarieren, 
dass auch auch bloß 2bit Speicherplatz benötigt? Ich könnte zwar die 
8bit in 4 mal 2 Bit aufteilen, aber das ist mir zu umständlich...

Gruß
Peter
#1372915
Nennt sich "Bit fields" und geht so:
1
#include "stdio.h"
2

3
struct packed_struct {
4
 unsigned int f1:2;
5
 unsigned int f2:2;
6
 unsigned int f3:2;
7
 unsigned int f4:2;
8
} pack;
9

10
int main() {
11
 struct packed_struct test;
12
 test.f1 = 3;
13
 test.f2 = 0;
14
 test.f3 = 1;
15
 test.f4 = 2;
16

17

18
 printf("0x%02X", *((unsigned char *)&test) );
19
}
(Hinter dem Doppelpunkt immer die Anzahl der bits)
Je nachdem was du für einen prozessor hast solltest du das struct auch 
komplett füllen (Für 8-bit prozessoren so wie oben) ums auszunutzen.

Das Beisiel gibt "0x93" aus was in binär wäre: 10 01 00 11 ;)
Gast #1372917
Du sagst leider nicht für welchen Prozessor und in welcher Sprache Du 
schreibst.

Aber, von Exoten abgesehen, ist die Breite eines Speicherwortes meist 8, 
16 oder 32 Bit. Ein geradzahliges Vielfaches von 8 (abgesehen von 8 
selbst).

>Ich könnte zwar die 8bit in 4 mal 2 Bit aufteilen, aber das ist mir zu 
>umständlich...

Dennoch kannst Du nur so Deine Absicht erreichen, in dem Du Makros oder 
Funktionen in C schreibst (oder entsprechendes in anderen Sprachen).
#1372920
Peter F. schrieb:
> Ich arbeite gerade an einem realtiv speicherintensiven Programm. Daher
> bin ich bestrebt, den Code soweit als möglich zu schrumpfen. Das
> Programm verarbeitet hauptsächlich Variablen mit den Werten 0,1,2 oder
> 3, also im Grunde 2bit. Ist es möglich eine Variabel so zu deklarieren,
> dass auch auch bloß 2bit Speicherplatz benötigt? Ich könnte zwar die
> 8bit in 4 mal 2 Bit aufteilen, aber das ist mir zu umständlich...

Das wird immer umständlich bleiben.
Die kleinste natürliche Einheit in C ist das Byte.
Man kann zwar ein Bitfeld definieren, und der Compiler nimmt einem dann 
die ganze Maskiererei ab, aber in deinem Fall ist das nicht so toll

Wenn deine 'vielen Variablen' sich in einem Array abbilden lassen, dann 
reicht es doch im ersten Ansatz 2 Zugriffsfunktionen zu definieren:
1
uint8_t memory[100];  // Platz für 400 2-Bit Variablen
2

3
uint8_t Read( uint16_t index )
4
{
5
  uint8_t memPos = index / 4;   // weil 4 jeweils 2 Bit Werte in einen uint passen
6
  uint8_t bitPos = index % 4;
7
  uint8_t value = memory[memPos];
8

9
  switch( bitPos ) {
10
    case 0:
11
      return ( value & 0xC0 ) >> 6;
12

13
    case 1:
14
      return ( value & 0x30 ) >> 4;
15

16
    case 2:
17
      return ( value & 0x0C ) >> 2;
18

19
    case 3:
20
      return ( value & 0x03 );
21
  }
22
}
23

24
void Write( uint16_t Index, uint8_t value )
25
{
26
  uint8_t memPos = index / 4;   // weil 4 jeweils 2 Bit Werte in einen uint passen
27
  uint8_t bitPos = index % 4;
28

29
  value &= ~0x03;
30

31
  switch( bitPos ) {
32
    case 0:
33
      memory[memPos] = ( memory[memPos] & ~0xC0 ) | ( value << 6 );
34
      break;
35

36
    case 1:
37
      memory[memPos] = ( memory[memPos] & ~0x30 ) | ( value << 4 );
38
      break;
39

40
    case 2:
41
      memory[memPos] = ( memory[memPos] & ~0x0C ) | ( value << 2 );
42
      break;
43

44
    case 3:
45
      memory[memPos] = ( memory[memPos] & ~0x03 ) | value;
46
      break;
47
  }
48
}

Recht viel anderes kann dir der Compiler auch nicht mit einem Bitfeld 
bieten, nur dass du hier das Array ev. einen Tick besser benutzen 
kannst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.