Spezi schrieb:
> Guten Morgen,
>
> vermutlich sehr einfache Frage.
> Ich habe folgendes Array:
>
> unsigned char Array[3];
>
> Jetzt möchte ich gerne das letzte Bit rausschieben.
> Array = Array >> 1 funktioniert natürlich nicht.
>
> Am allerliebsten würde ich die drei Array Elemente als eine Zahl in
> einem int abspeicher, also Array[0] = High Byte, Array[1] = MittelByte,
> Array[2] = Low Byte,
>
> Dann könnte ich das letzte Bit auch einfach rausscheiben.
>
> Wie macht man sowas?
Entweder in dem man im Array schiebt
1 | uint8_t Carry1, Carry2;
|
2 |
|
3 | Carry1 = Array[2] & 0x01;
|
4 | Array[2] >>= 1;
|
5 |
|
6 | Carry2 = Array[1] & 0x01;
|
7 | Array[1] >>= 1
|
8 | if( Carry1 )
|
9 | Array[2] |= 0x80
|
10 |
|
11 | Array[0] >>= 1;
|
12 | if( Carry1 )
|
13 | Array[0] |= 0x80;
|
oder den Compiler machen lassen, so wie du das vorgeschlagen hast.
1 | union convert
|
2 | {
|
3 | uint8_t Bytes[4];
|
4 | uint32_t Value;
|
5 | } convertVar;
|
6 |
|
7 | convertVar.Bytes[0] = Array[0];
|
8 | convertVar.Bytes[1] = Array[1];
|
9 | convertVar.Bytes[2] = Array[2];
|
10 | convertVar.Bytes[3] = 0;
|
11 |
|
12 | covertVar.Value >>= 1;
|
13 |
|
14 | Array[0] = convertVar.Bytes[0];
|
15 | ....
|
eine andere Möglichkeit, bei der man nicht umkopiert
1 | uint32_t * pValue;
|
2 |
|
3 | pValue = (uint32_t*)Array;
|
4 | *pValue >>= 1;
|
bei der Union Lösung hat man den Vorteil, dass man während des
Umkopierens gleich die Bytereihenfolge für einen unsigned long
entsprechend den Vorstellungen des COmpilers und/oder Systems anpassen
kann, falls das notwendig ist. Bei der Pointer Variante muss man mit dem
leben, wie sich der Compiler die Anordnung eines 32 Bit Wertes im
Speicher so vorstellt.
Oder aber: man findet einen Weg, wie man sich das ganze Bitgeschubse
sparen kann. Normalerweise ist das der beste Ansatz.