INT nur 6 Bit kopieren; Rest belassen

OP #4935198
Lesenswert?
• ▲
▼
Hallo,

ich möchte gerne in eine 8-Bit INT eine andere INT kopieren, von dieser 
jedoch nur die niedrigen 6 Bit. Die höherwertigen 2 Bit der 
ursprünglichen INT sollen bleiben.

Mit
1
a = (b & 63);

würde ich zwar in b an den betr. Stellen Nullen erzeugen, aber meine 
höherwertigen Bit, die ich erhalten möchte, werden gelöscht.

Wie würdet ihr das lösen?
#4935206
Lesenswert?
• ▲
▼
Zunächst solltest du dir die hexadezimale Schreibweise angewöhnen. Im 
ersten Moment vielleicht kurz gewöhnungsbedürftig, aber später 
erleichtert das einem das Lesen ungemein.

Also
1
a = (b & 0x3F);

Was willst du aber genau? Steht in a schon was drinne, was du behalten 
möchtest?
1
a = (a & 0xC0); // behalte die ersten beiden Bits
2
a = a | (b & 0x3F); // verOder die letzten 6 Bits
3

4
bzw. in kurz
5

6
a &= 0xC0;
7
a |= (b & 0x3F);
Beitrag #4935224 wurde von einem Moderator gelöscht.
Gast #4935274
Lesenswert?
• ▲
▼
Hi Nico,
Nico W. schrieb:
> Zunächst solltest du dir die hexadezimale Schreibweise angewöhnen.
> Im
> ersten Moment vielleicht kurz gewöhnungsbedürftig, aber später
> erleichtert das einem das Lesen ungemein.
magst du das bitte ein wenig näher Erläutern, inwiefern die das Lesen 
erleichtert?

Ich selbst bin kein richtiger Programmierer, und tue mich entsprechend 
jedes Mal schwer damit, hexadezimale Schreibweise im Code zu lesen.

Vielen Dank,
Alex
#4935279
Lesenswert?
• ▲
▼
Hexadezimal ist daher besser zu lesen, weil man zumeist sehr schnell 
sieht wie viele 1en man hat. Hexadezimal ist einfach deutlich näher an 
der binären Darstellung.

0xf = 0b1111 = 15
0xff = 0b11111111 = 255

Wie du schon schön da erkennen kannst, kann man für 4 1en einfach nen F 
anhängen. Bei Dezimal muss man rechnen.

0xC = 0b1100 = 12
0xC0 = 0b11000000 = 192

Einfach damit ein wenig beschäftigen. Ich habe vor ein paar Jahren auch 
nicht verstanden warum das so viel besser ist, bzw. warum das jeder so 
nutzt. Irgendwann ist dann der Groschen gefallen.
Moderator Persönliche Seite #4935283
Lesenswert?
• ▲
▼
Alex schrieb:
> Hi Nico,
> Nico W. schrieb:
>> Zunächst solltest du dir die hexadezimale Schreibweise angewöhnen.
>> Im
>> ersten Moment vielleicht kurz gewöhnungsbedürftig, aber später
>> erleichtert das einem das Lesen ungemein.
> magst du das bitte ein wenig näher Erläutern, inwiefern die das Lesen
> erleichtert?
>
> Ich selbst bin kein richtiger Programmierer, und tue mich entsprechend
> jedes Mal schwer damit, hexadezimale Schreibweise im Code zu lesen.

Bei der dezimalen Schreibweise ist es sehr schwer, zu erkennen, welche 
Bits denn jetzt wirklich gesetzt bzw. gelöscht werden.

Bei der hexadezimalen (korrekt heisst es eigentlich "sedezimal", das 
Attribut verwendet aber niemand ;-) Schreibweise hast Du immer genau 
vier Bits in einer Ziffer gruppiert. Du musst Dir also nur die 16 
verschiedenen "Ziffern" in ihrer Bitdarstellung merken und kannst an 
einer Hexadezimalzahl sofort erkennen, welche Bits gesetzt sind.

Beispiel: 0x1000 heisst: die unteren 3*4 Bits sind null, nur das Bit 12 
ist gesetzt, ausgeschrieben als Dualzahl wäre das 0001 0000 0000 0000.

Der dezimalen Schreibweise 4096 sieht man das nicht an.
Moderator Persönliche Seite #4935291
Lesenswert?
• ▲
▼
Ja, je nach C-Compiler gibt es die auch. Der GCC-AVR kann das, wenn man 
"0b" voranstellt:

255 = 0xFF = 0b11111111

Dein Beispiel wäre also so etwas:

(b & 0x3F) | (a & 0xC0) wird zu

(b & 0b00111111) | (a & 0b11000000)

Aber man sieht, dass mit der zunehmenden Anzahl an Bits das Ganze 
unleserlich wird. Bei 32 Bit lässt man das dann lieber ;-)

Ist das schon in irgendeinen C-Standard eingeflossen?
Genaueres dazu sollten aber die Compilerexperten hier wissen.
Gast #4935295
Lesenswert?
• ▲
▼
Vielen Dank für eure Rückmeldung. Ich finde/fand die binäre Darstellung 
immer am Anschaulichsten, da ich sofort sehen kann, welches Bit im 
Register gesetzt / gelöscht ist, ohne eine Zwischenrechnung zu machen.

Eure Ausführungen werde ich aber noch mal in Ruhe sacken lassen und 
verarbeiten. Wird sicherlich auch bei mir nur eine Frage der Gewöhnung 
sein :)

Cheers,
Moderator Persönliche Seite #4935352
Lesenswert?
• ▲
▼
Peter D. schrieb:
> Chris D. schrieb:
>> Aber man sieht, dass mit der zunehmenden Anzahl an Bits das Ganze
>> unleserlich wird.
>
> Man könnte sich dafür ein Macro schreiben:

Schöne Idee :-)

Aber dadurch wird es auch weniger leserlich.

Vielleicht einfach eine (etwas längere) Tabelle mit defines, zumindest 
bis 16 Bit?
1
#define b0000_0000_0000_0000 0x0000
2
...
3
#define b1111_1111_1111_1111 0xFFFF

Wie schnell ist der Präprozessor? ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren