Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Einzelne Bits in einem char Setzen - c++

Diskussion: Einzelne Bits in einem char Setzen - c++ im Forum Code Kitchen, in der Kategorie Software Home; Anzeige hi leutz! also ich bräuchte eine funktion die mir einen übergebenen 8-stelligen string der nur aus nullen und einsen ...

Antwort
Alt 20.04.06, 01:43   #1 (permalink)
 
Registriert seit: 17.01.06
Fruetschi Leistung: Facit NTK
Likes: 0
Standard Einzelne Bits in einem char Setzen - c++

Anzeige

hi leutz!

also ich bräuchte eine funktion die mir einen übergebenen 8-stelligen string der nur aus nullen und einsen besteht in einen char "quetscht" indem er die einzelnen bits des chars setzt!
hab schon gegoogelt aber nichts wirklich brauchbares gefunden! ich weiß zwar wie man sie setzt wenn man im vorhinein weiß welche bits gesetzt werden müssen aber nicht wie man es dynamisch macht!
würde mich besonders über eine fertige funktion freuen aber es genügt auch eine erklärung!

danke schon mal im vorhinein!

Fruetschi ist offline   Mit Zitat antworten
Alt 20.04.06, 02:31   #2 (permalink)
 
Registriert seit: 04.01.05
Sunrize Leistung: Facit NTK
Likes: 0
Standard

Constant values for built-in types are expressed as
decimal, octal, hexadecimal, or floating-point numbers (sadly,
binary numbers were not considered important), or as characters.
(Thinking in C++, S.154)

Code:
#include <iostream>

using namespace std;

// Gibt einzelne Bits eines chars aus
void printBinary(const unsigned char val) {
    for(int i = 7; i >= 0; i--)
    if(val & (1 << i))
    std::cout << "1";
    else
    std::cout << "0";
    cout <<"\n";
}

int main(void) {
    char x = 0x00;
    
    printBinary(x);
    
    // binäre oder verknüpfung, um bits zu setzen
    x = x | 0x13;
    
    printBinary(x);
    
    // binäre und verknüpfung, um bits zu setzen
    x = x & 0x02;
    
    printBinary(x);
    
    cout <<"\n";
    system("PAUSE"); 
}
Damit sollte es ein leichtes sein, eine Funktion zu bauen, die einzelne Bits setzt.
Siehe auch Thinking in C++, S.159 folgende.

Die einzelnen 0en und 1en holst Du Dir per charAt() aus Deinem String.

Hendrik
Sunrize ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 20.04.06, 13:44   #3 (permalink)
Themenstarter
 
Registriert seit: 17.01.06
Fruetschi Leistung: Facit NTK
Likes: 0
Standard

kann es sein das du dich vertippt hast?

Zitat:
// binäre und verknüpfung, um bits zu setzen <--- löschen oder?
x = x & 0x02;
ich versteh zwar das mit den bitweisen & und | verknüpfungen aber wie mach ich das ganze wenn ich im vorhinein nicht weiß welche bits ich setzen muss.
Bsp:
Code:
#include <stdio.h>
#include <string.h>

char* int2bin(unsigned int a);

void main()
{
char str[9], byte;
gets(str); //der eingelesene string enthält nur nullen und einsen
byte = str2char(str); //diese funktion brauche ich
printf("%s = %s", str, int2bin(byte));
}

char* int2bin(unsigned int a)
{
  static char s[9];
  int i;

  for( i = 8; i >= 0; --i )
    {
      s[i] = ( (a & 0x1) == 0) ? '0' : '1';
      a >>= 1;
    }
  s[8] = '\0';
  return s;
}
PS: das ganze is für nen komprimierungsalgorithmus und ich muss das ganze jetzt wieder byteweise in ne file speichern!
Fruetschi ist offline   Mit Zitat antworten
Alt 20.04.06, 14:38   #4 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Zwar nicht genau das was du suchst, aber es geht in diese Richtung:
Code:
//get bit at <pos> in <arr> ( counting starts at 0)
bool BitManip::getBitAt(unsigned char* arr,unsigned int pos)
{
	if((int)arr==0)
		return 0;
	int arrpos=(int)((pos)/8);
	return (bool)((arr[arrpos] & (int)(pow(2,7-(pos%8)))) >> ((7-(pos%8))));
}
//set bit at <pos> in <arr> to <state> (counting starts at 0)
int BitManip::setBitAt(unsigned char* arr,unsigned int pos,bool state)
{
	if((int)arr==0)
		return BitManip::EINVALID_PARAM;
	if(state)
	{
		arr[(int)((pos)/8)] = arr[(int)(pos/8)] | (int)(pow(2,7-(pos%8)));
	}
	else
	{
		arr[(int)(pos/8)] = arr[(int)(pos/8)] & (~(int)(pow(2,7-(pos%8))));
	}
}
//rotate left <arr>, interpreted as a value with <bitcnt> bits, <count> times
int BitManip::rol(unsigned char* arr,unsigned int bitcnt,unsigned int count)
{
	unsigned char* orig;
	unsigned int length;
	if(bitcnt==0 || count == 0 || (int)arr==0)
		return BitManip::EINVALID_PARAM;
	if(bitcnt%8!=0)
		length = ((int)(bitcnt/8)) + 1;
	else
		length = bitcnt/8;
	orig = new unsigned char[length];
	for(unsigned int i=0;i<count;++i)
	{
		for(unsigned int i=0;i<length;++i)
		{
			orig[i]=arr[i];
		}
		for(unsigned int j=0;j<bitcnt;++j)
		{
			unsigned int pos=(j==bitcnt-1)?0:j+1;
			setBitAt(arr,j,getBitAt(orig,pos));
		}
	} 
        delete orig;
	return 0;
}
Damit lassen sich Bitfelder durch char-Arrays realisieren. Funktionsnamen dürften eigentlich selbstklärend sein. Ich habe das vor einiger Zeit mal geschrieben, als ich mich mit DES beschäftigt habe.
Das ganze geht also auch für einzelne chars.(Bit 0 ist das Bit ganz links)
btw: EINVALID_PARAM steht irgendwo in einer Headerdatei, genauso wie die Definition von namespace BitManip. rol passt hier nicht hin, ich weiß, aber vllt kann es jemand gebrauchen.

Nun müsstest du deinen String zeichenweise durchgehen und dann immer setBitAt mit state=false oder true aufrufen, je nachdem ob das Zeichen eine 1 oder eine 0 ist.
Lesco ist offline   Mit Zitat antworten
Alt 20.04.06, 17:03   #5 (permalink)
Themenstarter
 
Registriert seit: 17.01.06
Fruetschi Leistung: Facit NTK
Likes: 0
Standard

thx! ich hab deine funktion ein wenig umgecodet und sie funktioniert jetzt!

Code:
char str2char(char *str)
{
  char byte;
  int i=0;
  while(str[i] != '\0')
  {
    if(str[i] == '0')
      byte = byte&(~(int)(pow(2,7-(i%8))));
    else
      byte = byte|(int)(pow(2,7-(i%8)));
    i++;
  }
  return byte;
}
Fruetschi ist offline   Mit Zitat antworten
Alt 21.04.06, 14:23   #6 (permalink)
 
Registriert seit: 04.01.05
Sunrize Leistung: Facit NTK
Likes: 0
Standard

Was man jetzt setzen nennt und was löschen heist, ist wohl etwas schwammig. Ich kann ein Bit auf 1 setzen oder auf 0 setzen.
Ja, bei der AND Verknüpfung gehen 1er verloren, aber bei der OR gehen 0er verloren.
Löschen finde ich hier unpassend, aber das wohl Geschmacksache.

Hendrik
Sunrize ist offline   Mit Zitat antworten
Alt 21.04.06, 16:19   #7 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Aber die Bezeichnungen "Bit setzen" für Bit=1 und "Bit löschen" für Bit=0 haben sich durchgesetzt.
Bsp.: Der opcode clc steht für "clear carry flag", es wird dabei auch ein bestimmtes Bit im eflags register auf 0 gesetzt und die passendste Übersetzung für "clear" dürfte wohl löschen sein.
Lesco ist offline   Mit Zitat antworten
Alt 22.04.06, 13:30   #8 (permalink)
 
Registriert seit: 04.01.05
Sunrize Leistung: Facit NTK
Likes: 0
Standard

Was ich ursprünglich sagen wollte, es ist ok löschen und setzen zu sagen, aber
auch Bit auf 0 setzen sollte nicht als fehlerhafte Aussage betrachtet werden.
Ansonsten gibts das noch:
http://de.wikipedia.org/wiki/Negative_Logik

Hendrik
Sunrize ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Einzelne Bits in einem char Setzen - c++
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[C++] Vector nach char? Extinction Code Kitchen 3 06.11.07 16:59
BITS 2.0 - Was macht das ? 0wnZ Windows 2 11.04.07 12:36
Bits einer Diskette?? RedEagle Code Kitchen 4 14.07.05 13:37
Einzelne Bits ansprechen/Länge von Zahl PeasantKing Code Kitchen 16 12.01.05 18:27
[debian] Bits from the RM sieben News & Ankündigungen 0 02.09.03 06:18


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