Kurzusok
/
C#
C#
/
Feladatok
/
Hiperoptimalizált telemetria
Hiperoptimalizált telemetria

Hiperoptimalizált telemetria

Tanulófeladat

Bevezetés

Egész számok

A C# a sok statikusan típusos nyelvhez hasonlóan számos olyan típust kínál, amelyek egész számokat reprezentálnak, és mindegyiknek saját értéktartománya van. A tartomány alsó végén az sbyte típus minimuma -128, maximuma 127. Ahogy minden egész típusnál, ezek az értékek itt is <type>.MinValue és <type>.MaxValue formában érhetők el. A felső végén a long típus minimuma -9,223,372,036,854,775,808, maximuma pedig 9,223,372,036,854,775,807. A kettő között helyezkedik el a short és az int típus.

A tartományokat az határozza meg, hogy a rendszer mekkora tárolási szélességet biztosít az adott típusnak. Például a byte 8 bitet használ, a long pedig 64 bitet.

A fenti típusok mindegyikéhez tartozik egy előjel nélküli megfelelő: sbyte/byte, short/ushort, int/uint és long/ulong. Mindegyik esetben az értékek tartománya 0-tól a negatív előjeles maximum kétszereséig plusz 1-ig terjed.

Típus Szélesség Minimum Maximum
sbyte 8 bit -128 +127
short 16 bit -32_768 +32_767
int 32 bit -2_147_483_648 +2_147_483_647
long 64 bit -9_223_372_036_854_775_808 +9_223_372_036_854_775_807
byte 8 bit 0 +255
ushort 16 bit 0 +65_535
uint 32 bit 0 +4_294_967_295
ulong 64 bit 0 +18_446_744_073_709_551_615

Egy adott típusú változó (vagy kifejezés) könnyedén átalakítható egy másik típusúvá. Egy értékadásnál például, ha a hozzárendelendő érték típusa (lhs) biztosítja, hogy az érték a hozzárendelés céljául szolgáló típus (rhs) tartományába essen, akkor egyszerű értékadásról van szó:

uint ui = uint.MaxValue;
ulong ul = ui;    // no problem

Másrészt, ha a forrásul szolgáló típus tartománya nem részhalmaza a cél típus értéktartományának, akkor egy cast, azaz () műveletre van szükség, még akkor is, ha az adott érték a cél típus tartományán belül van:

short s = 42;
uint ui = (uint)s;

Bitkonverzió

A BitConverter osztály kényelmes módot kínál arra, hogy az egész típusokat bájtokból álló tömbökké alakítsd, és vissza.

Utasítások

Folytatódik a távirányítós autó projektje. A telemetriai rendszer sávszélessége szűkös, ezért arra kértek, hogy valósíts meg egy üzenetprotokollt a telemetriai adatok továbbításához.

Az adatok pufferekben (byte-tömbökben) továbbítódnak. Egészek küldésekor a puffer mérete csökken az alább leírt protokoll alkalmazásával.

Minden értéket a lehető legkisebb egész típusban érdemes ábrázolni (a byte és sbyte típus nem szerepel, mert a megtakarítás elhanyagolható lenne):

Ettől Eddig Típus
4_294_967_296 9_223_372_036_854_775_807 long
2_147_483_648 4_294_967_295 uint
65_536 2_147_483_647 int
0 65_535 ushort
-32_768 -1 short
-2_147_483_648 -32_769 int
-9_223_372_036_854_775_808 -2_147_483_649 long

Az értéket a hozzá rendelt típushoz tartozó megfelelő számú byte-ra kell átalakítani. A teljes puffer egy olyan byte-ból áll, amely a pufferben lévő további byte-ok számát jelzi (prefix byte), ezt követik az egészet tároló byte-ok (payload bytes).

Néhány típus ugyanannyi byte-ot használ (pl. a uint és az int típus). Normális esetben ugyanaz lenne a prefix byte-juk, de ez problémássá tenné a dekódolást. Ennek kiküszöbölésére a protokoll egy kis trükköt vezet be: előjeles típusoknál a prefix byte értéke 256 mínusz a pufferben lévő további byte-ok száma.

A kommunikációban csak a prefix byte és az általa jelzett számú következő byte kerül elküldésre. Belül mind a küldő, mind a fogadó rutin egy 9 byte-os puffert használ (szükség esetén záró nullákkal).

1. Egész érték kódolása küldésre készen

Valósítsd meg a statikus TelemetryBuffer.ToBuffer() metódust, amely a metódusnak átadott paramétert veszi, és pufferré kódolja.

// Type: ushort, bytes: 2, signed: no, prefix byte: 2
TelemetryBuffer.ToBuffer(5)
// => {0x2, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };

// Type: int, bytes: 4, signed: yes, prefix byte: 256 - 4
TelemetryBuffer.ToBuffer(Int32.MaxValue)
// => {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 };

2. Fogadott puffer dekódolása

Valósítsd meg a statikus TelemetryBuffer.FromBuffer() metódust, amely dekódolja a fogadott puffert, és az értéket long formájában adja vissza.

TelemetryBuffer.FromBuffer(new byte[] {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 })
// => 2147483647

Ha a prefix byte értéke nem várt, akkor 0-t kell visszaadni.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
C# Exercism

Készen állsz elkezdeni a(z) Hiperoptimalizált telemetria feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) C# nyelvet 62 fogalom178 feladat segítségével, valódi emberi mentorálással, mindez ingyen.