Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Определение младшего и старшего байта числа типа int. Нужна подсказка

Непрочитано 14.06.2013, 10:49  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от tempora Посмотреть сообщение
Способ классный! Только пользоваться им нельзя, по причине, верно отмеченной _Артём_'ом. Если бы не эта беда, то цены б ему не было! Красиво, изящно... вот только, блин, не сработает и никому не скажет же...
Сам то не скажет но вычислить порядок Вы можете довольно таки элементарно. Причем в интернете масса способов как это сделать. По любому Вы должны знать платформу на которой работаете. И пользоваться этим способом я считаю можно, а в некоторых случаях просто необходимо.

Судите сами, вот у Вас 8ми битных процессор, а нужно получить старший байт переменной типа long long int.
И что будете делать сдвиг?

long long int A;
char B;

B= A››56;

А теперь прикиньте что процессору придется делать 56 сдвигов для 8ми байт, и того 8*56=448 операций сдвига, не считая вспомогательных процедур (увеличит, сравнить счетчик...).
То что это примерно так и откомпилируется у меня нет сомнений - проверял.

Полбеды если если речь идет об одной отдельной переменной, а что если надо обработать массив? Учитывая что поц. у нас простенький, 8ми битный, программа будет работать медленно, грубо говоря "ТОРМОЗИТЬ".
Предложенный мной способ однозначно отработает быстрее.
Реклама:
AlexPi вне форума  
Непрочитано 14.06.2013, 11:02  
evg220
Гражданин KAZUS.RUN
 
Аватар для evg220
 
Регистрация: 03.02.2007
Сообщений: 116
Сказал спасибо: 3
Сказали Спасибо 20 раз(а) в 9 сообщении(ях)
evg220 на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от _Артём_ Посмотреть сообщение
unsigned long GetWord(unsigned char *ptr)
{
unsigned long result=0;
result+=((unsigned long)(*ptr++))‹‹24;
result+=((unsigned long)(*ptr++))‹‹16;
result+=((unsigned long)(*ptr++))‹‹8;
result+=((unsigned long)(*ptr++));
return result;
}
Сложно. Долго. Не универсально.
Но если использовать стандартные средства С...
Код:
typedef union STRCT {
int_16 A : 16;
int_16 B : 16;
}
...
int_32 C = 0x12345678;
STRCT *S = (STRCT*)&C;
int_16 A = S-›A; // 0x1234
int_16 B = S-›B; // 0x5678
...
Этот метод позволяет получить прямой доступ к любому числу бит в произвольном массиве...
__________________
Здесь вам не тут!

Последний раз редактировалось evg220; 14.06.2013 в 11:30.
evg220 вне форума  
Непрочитано 14.06.2013, 11:15  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
Судите сами, вот у Вас 8ми битных процессор, а нужно получить старший байт переменной типа long long int.

Полбеды если если речь идет об одной отдельной переменной, а что если надо обработать массив? Учитывая что поц. у нас простенький, 8ми битный, программа будет работать медленно, грубо говоря "ТОРМОЗИТЬ".
Активно юзать long long на восьмибитниках само по себе уже извращение. Одно дело двадцать лет назад, когда "нету и дорого", другое дело сейчас, когда восьмибитники в одну цену с 32-ух битниками.
Получается "не по задаче камень".
nahimovv вне форума  
Непрочитано 14.06.2013, 12:28  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от nahimovv Посмотреть сообщение
Активно юзать long long на восьмибитниках само по себе уже извращение.
Но бывает жизнь заставляет. Знаете как в армии сказал командир отсюда и до ..., и никуда Вы не денетесь.


Сообщение от nahimovv Посмотреть сообщение
Одно дело двадцать лет назад, когда "нету и дорого", другое дело сейчас, когда восьмибитники в одну цену с 32-ух битниками.
Получается "не по задаче камень".
Вообщем неважно какой процессор пусть 32 бита, важно что сдвигами не оптимально по скорости. Будете сдвигать в таком случае 56*2 = 112 раз.
Все равно долго. Прочесть байт из массива по любому на порядок быстрее.

А вообще я никому свой метод не навязываю, хотите сдвигать - двигайте сколько кому угодно будет.
AlexPi вне форума  
Непрочитано 14.06.2013, 12:34  
evg220
Гражданин KAZUS.RUN
 
Аватар для evg220
 
Регистрация: 03.02.2007
Сообщений: 116
Сказал спасибо: 3
Сказали Спасибо 20 раз(а) в 9 сообщении(ях)
evg220 на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
Все равно долго. Прочесть байт из массива по любому на порядок быстрее.
Да. Но прямой доступ к любой последовательности бит - еще эффективней.
__________________
Здесь вам не тут!
evg220 вне форума  
Непрочитано 14.06.2013, 12:42  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
Вообщем неважно какой процессор пусть 32 бита, важно что сдвигами не оптимально по скорости. Будете сдвигать в таком случае 56*2 = 112 раз.
Все равно долго.
Ошибаетесь. Вам за что и толкуют, что сдвиги в 16-ти и 32-ух битниках очень быстрые, по сути - одна команда.
Цитата:
Прочесть байт из массива по любому на порядок быстрее.
Могу огорчить. В 32-ух битниках - не всегда.
nahimovv вне форума  
Непрочитано 14.06.2013, 13:57  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от nahimovv Посмотреть сообщение
Ошибаетесь. Вам за что и толкуют, что сдвиги в 16-ти и 32-ух битниках очень быстрые, по сути - одна команда.
Вы хотите сказать что процессор сдвинет слово (16 или 32 бита) за одну операцию на заданное кво-во бит?
Может я конечно и чего-то не знаю но мне кажется что за команду он сдвинет Вам (пусть и все 32 бита) но всего на 1 разряд. Если Вы знаете такой проц. который за одну инструкцию способен сделать сдвиг слова на n разрядов, то пожалуйста напишите о каком конкретно процессоре идет речь.
AlexPi вне форума  
Непрочитано 14.06.2013, 14:01  
AlexPi
Прописка
 
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
AlexPi на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от nahimovv Посмотреть сообщение
Могу огорчить. В 32-ух битниках - не всегда.
А вот здесь да, Вы в принципе правы, потому то и 32 бита не всегда хорошо, не оптимально использует память.
Потому-то при переносе кода с восьми битника на 32х битник надо больше памяти.
AlexPi вне форума  
Непрочитано 14.06.2013, 14:25  
evg220
Гражданин KAZUS.RUN
 
Аватар для evg220
 
Регистрация: 03.02.2007
Сообщений: 116
Сказал спасибо: 3
Сказали Спасибо 20 раз(а) в 9 сообщении(ях)
evg220 на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
Если Вы знаете такой проц. который за одну инструкцию способен сделать сдвиг слова на n разрядов
Intel. По крайней мере с 286...
__________________
Здесь вам не тут!
evg220 вне форума  
Непрочитано 14.06.2013, 14:35  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Определение младшего и старшего байта числа типа int. Нужна подсказка

Сообщение от AlexPi Посмотреть сообщение
Если Вы знаете такой проц. который за одну инструкцию способен сделать сдвиг слова на n разрядов, то пожалуйста напишите о каком конкретно процессоре идет речь.
Cortex-M может:
Цитата:
3.5.3 ASR, LSL, LSR, ROR, and RRX
Arithmetic Shift Right, Logical Shift Left, Logical Shift Right, Rotate Right, and Rotate Right with Extend.
3.5.3.1 Syntax
op{S}{cond} Rd, Rm, Rs
op{S}{cond} Rd, Rm, #n
RRX{S}{cond} Rd, Rm
where:
op is one of:
ASR Arithmetic Shift Right.
LSL Logical Shift Left.
LSR Logical Shift Right.
ROR Rotate Right.
S is an optional suffix. If S is specified, the condition code flags are updated on the result of the
operation, see Section 3.3.7 (p. 43) .
Rd is the destination register.
Rm is the register holding the value to be shifted.
Rs is the register holding the shift length to apply to the value in Rm. Only the least significant byte is
used and can be in the range 0 to 255.
n is the shift length. The range of shift length depends on the instruction:
ASR shift length from 1 to 32
LSL shift length from 0 to 31
LSR shift length from 1 to 32
ROR shift length from 1 to 31.
_Артём_ вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение типа симистора maks191 Информация по радиокомпонентам 5 09.12.2012 23:15
Научите int в два байта и наоборот? ) whoim Электроника - это просто 4 13.08.2012 21:56
Как 4 байта, принятых по USART превратить в число формата long int Black Jack Микроконтроллеры, АЦП, память и т.д 2 06.06.2012 21:32
Определение типа усилителя JeckVi Электроника - это просто 16 22.02.2010 17:49
Программное определение типа EEPROM Jendoss Микроконтроллеры, АЦП, память и т.д 3 24.03.2009 18:44


Часовой пояс GMT +4, время: 20:51.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.