<html><body>Presne tak - pouzit union, nebo aspon, pokud jsou k dispozici, tak makra HTONS/L, ktery osetri endian.<br><br>-- <br>Pavel Brychta<br>http://www.xpablo.cz<br><br><aside>---------- Původní e-mail ----------<br>Od: tomas mainzer <t.mainzer@gmail.com><br>Komu: HW-news <hw-list@list.hw.cz><br>Datum: 31. 8. 2023 8:50:32<br>Předmět: Re: Jak to v C++ napsat líp?</aside><br><blockquote data-email="t.mainzer@gmail.com"><div dir="ltr"><div dir="ltr">Muze byt. co jsem koukal na podobne konstrukce do kodu, prekladace z toho obvykle poznaji co chcete a resi to ocekavane (presunuji byte, ne ze tam realne delaji tu rotaci) </div><div>Ale je li pozadovana prenositelnost - pak je napr ruzne sizeof(int) a ruzna endianita - tak je treba davat dost pozor a zachazet s tim vsude stejne. <br></div><div>Minimalne bych pouzil je li mozne definici uint16_t misto int. take pozor na char, norma nedefinuje znamenko takze explicitne uvadet unsigned, nebo uzit uint8_t. </div><div>Dalsi  mozny pristup je pres union ala:  <br></div><div dir="ltr"><div><br></div><div>typedef struct tag16b {<br></div><div><div>union {</div><div>  struct {</div><div>    uint16_t w;   //word</div><div>  };  </div><div>  struct {</div><div>    uint8_t b[2];  //bytes</div><div>  };</div><div>  struct {                //bits</div><div>    unsigned b0:1;</div><div>    unsigned b1:1;</div><div>    unsigned b2:1;</div><div>    unsigned b3:1;</div><div>    unsigned b4:1;</div><div>    unsigned b5:1;</div><div>    unsigned b6:1;</div><div>    unsigned b7:1;</div><div>    unsigned b8:1;</div><div>    unsigned b9:1;</div><div>    unsigned b10:1;</div><div>    unsigned b11:1;</div><div>    unsigned b12:1;</div><div>    unsigned b13:1;</div><div>    unsigned b14:1;</div><div>    unsigned b15:1;</div><div>    };</div><div>  };</div><div>} int16b;</div></div><div><br></div></div></div><br><div class="-wm-gmail_quote"><div dir="ltr" class="-wm-gmail_attr">čt 31. 8. 2023 v 8:10 odesílatel Jaroslav Buchta <<a href="mailto:jaroslav.buchta@hascomp.cz">jaroslav.buchta@hascomp.cz</a>> napsal:<br></div><blockquote class="-wm-gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Me to prijde dost OK, pokud se doplni komentar...<br>
Daly by se asi udelat nejake kudrlinky, makra, pretizit operatory, <br>
udelat na to objekty... ale pokud je to jen na jednom/par mistech... ;-)<br>
<br>
Dne 31.08.2023 v 8:05 Martin Záruba napsal(a):<br>
> Mám pole<br>
><br>
> int A[2];<br>
><br>
> potřebuji do něj ale vložit  čtyři znaky ABCD. Vymyslel jsem<br>
><br>
> A[0] = ('A' << 8) | 'B';<br>
> A[1] = ('C' << 8) | 'D';<br>
><br>
> nejde to nějak líp? Toto funguje, ale je to docela nesrozumitelné.<br>
><br>
<br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by <a href="http://www.hw.cz" rel="noreferrer">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
</blockquote></div>
_______________________________________________
<br>HW-list mailing list  -  sponsored by www.HW.cz
<br>Hw-list@list.hw.cz
<br>http://list.hw.cz/mailman/listinfo/hw-list
<br></blockquote></body></html>