| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
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 ...
![]() |
| | #1 (permalink) |
| Registriert seit: 17.01.06 ![]() Likes: 0 | 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! |
| | |
| | #2 (permalink) |
| Registriert seit: 04.01.05 ![]() Likes: 0 | 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");
} Siehe auch Thinking in C++, S.159 folgende. Die einzelnen 0en und 1en holst Du Dir per charAt() aus Deinem String. Hendrik |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) | |
| Themenstarter Registriert seit: 17.01.06 ![]() Likes: 0 | kann es sein das du dich vertippt hast? Zitat:
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;
} | |
| | |
| | #4 (permalink) |
| Senior Member Registriert seit: 03.09.05 ![]() Likes: 0 | 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;
} 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. |
| | |
| | #5 (permalink) |
| Themenstarter Registriert seit: 17.01.06 ![]() Likes: 0 | 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;
} |
| | |
| | #6 (permalink) |
| Registriert seit: 04.01.05 ![]() Likes: 0 | 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 |
| | |
| | #7 (permalink) |
| Senior Member Registriert seit: 03.09.05 ![]() Likes: 0 | 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. |
| | |
| | #8 (permalink) |
| Registriert seit: 04.01.05 ![]() Likes: 0 | 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 |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [C++] Vector | 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 |