Судя по стартовому посту темы, вопрос касался
оптимизации кода, т.е. стремления избавиться от операции 8-кратного сдвига, который МК обычно не умеют делать одной инструкцией. А то и вызывают на этом месте библиотечную функцию, которая осуществляет сдвиги в цикле со счетчиком. Тогда как ответы в общем-то сводятся к тому, как этот сдвиг красивше записать. Т.е. в плане оптимизации эти ответы не только бесполезны, но и уже негативно проявили себя по части всевозможных ошибок при реализации.
В этом плане выражение
Код
*(char *)&Temp = TD_receive_byte();
*((char *)&Temp + 1) = TD_receive_byte();
было вполне оптимальным, с тем лишь недостатком, что оказалось непонятным топикстартеру. Т.е. его и надо было просто разъяснить, но не возвращаться к сдвигу.
На этот счет могу предложить альтернативу с union, которая в максимальной степени оптимальна, но гораздо проще в понимании:
Код
uint16_t temp_18b20()
{
union {
unsigned char byte[2];
uint16_t word;
} temp;
...
temp.byte[1] = TD_receive_byte();
temp.byte[0] = TD_receive_byte();
...
return temp.word;
}
Здесь union располагает в одной и той же памяти 2 байта byte и одно слово word, тем самым, позволяя заполнить последнее по частям.