Определение младшего и старшего байта числа типа int. Нужна подсказка
14.06.2013, 10:49
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от tempora
|
|
Способ классный! Только пользоваться им нельзя, по причине, верно отмеченной _Артём_'ом. Если бы не эта беда, то цены б ему не было! Красиво, изящно... вот только, блин, не сработает и никому не скажет же...
|
Сам то не скажет но вычислить порядок Вы можете довольно таки элементарно. Причем в интернете масса способов как это сделать. По любому Вы должны знать платформу на которой работаете. И пользоваться этим способом я считаю можно, а в некоторых случаях просто необходимо.
Судите сами, вот у Вас 8ми битных процессор, а нужно получить старший байт переменной типа long long int.
И что будете делать сдвиг?
long long int A;
char B;
B= A››56;
А теперь прикиньте что процессору придется делать 56 сдвигов для 8ми байт, и того 8*56=448 операций сдвига, не считая вспомогательных процедур (увеличит, сравнить счетчик...).
То что это примерно так и откомпилируется у меня нет сомнений - проверял.
Полбеды если если речь идет об одной отдельной переменной, а что если надо обработать массив? Учитывая что поц. у нас простенький, 8ми битный, программа будет работать медленно, грубо говоря "ТОРМОЗИТЬ".
Предложенный мной способ однозначно отработает быстрее.
|
|
|
|
14.06.2013, 11:02
|
|
|
Гражданин KAZUS.RUN
Регистрация: 03.02.2007
Сообщений: 116
Сказал спасибо: 3
Сказали Спасибо 20 раз(а) в 9 сообщении(ях)
|
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.
|
|
|
|
14.06.2013, 11:15
|
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от AlexPi
|
Судите сами, вот у Вас 8ми битных процессор, а нужно получить старший байт переменной типа long long int.
Полбеды если если речь идет об одной отдельной переменной, а что если надо обработать массив? Учитывая что поц. у нас простенький, 8ми битный, программа будет работать медленно, грубо говоря "ТОРМОЗИТЬ".
|
Активно юзать long long на восьмибитниках само по себе уже извращение. Одно дело двадцать лет назад, когда "нету и дорого", другое дело сейчас, когда восьмибитники в одну цену с 32-ух битниками.
Получается "не по задаче камень".
|
|
|
|
14.06.2013, 12:28
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от nahimovv
|
|
Активно юзать long long на восьмибитниках само по себе уже извращение.
|
Но бывает жизнь заставляет. Знаете как в армии сказал командир отсюда и до ..., и никуда Вы не денетесь.
Сообщение от nahimovv
|
Одно дело двадцать лет назад, когда "нету и дорого", другое дело сейчас, когда восьмибитники в одну цену с 32-ух битниками.
Получается "не по задаче камень".
|
Вообщем неважно какой процессор пусть 32 бита, важно что сдвигами не оптимально по скорости. Будете сдвигать в таком случае 56*2 = 112 раз.
Все равно долго. Прочесть байт из массива по любому на порядок быстрее.
А вообще я никому свой метод не навязываю, хотите сдвигать - двигайте сколько кому угодно будет.
|
|
|
|
14.06.2013, 12:34
|
|
|
Гражданин KAZUS.RUN
Регистрация: 03.02.2007
Сообщений: 116
Сказал спасибо: 3
Сказали Спасибо 20 раз(а) в 9 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от AlexPi
|
|
Все равно долго. Прочесть байт из массива по любому на порядок быстрее.
|
Да. Но прямой доступ к любой последовательности бит - еще эффективней.
__________________
Здесь вам не тут!
|
|
|
|
14.06.2013, 12:42
|
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от AlexPi
|
Вообщем неважно какой процессор пусть 32 бита, важно что сдвигами не оптимально по скорости. Будете сдвигать в таком случае 56*2 = 112 раз.
Все равно долго.
|
Ошибаетесь. Вам за что и толкуют, что сдвиги в 16-ти и 32-ух битниках очень быстрые, по сути - одна команда.
|
Цитата:
|
|
Прочесть байт из массива по любому на порядок быстрее.
|
Могу огорчить. В 32-ух битниках - не всегда.
|
|
|
|
14.06.2013, 13:57
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от nahimovv
|
|
Ошибаетесь. Вам за что и толкуют, что сдвиги в 16-ти и 32-ух битниках очень быстрые, по сути - одна команда.
|
Вы хотите сказать что процессор сдвинет слово (16 или 32 бита) за одну операцию на заданное кво-во бит?
Может я конечно и чего-то не знаю но мне кажется что за команду он сдвинет Вам (пусть и все 32 бита) но всего на 1 разряд. Если Вы знаете такой проц. который за одну инструкцию способен сделать сдвиг слова на n разрядов, то пожалуйста напишите о каком конкретно процессоре идет речь.
|
|
|
|
14.06.2013, 14:01
|
|
|
Прописка
Регистрация: 14.09.2010
Сообщений: 105
Сказал спасибо: 9
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от nahimovv
|
|
Могу огорчить. В 32-ух битниках - не всегда.
|
А вот здесь да, Вы в принципе правы, потому то и 32 бита не всегда хорошо, не оптимально использует память.
Потому-то при переносе кода с восьми битника на 32х битник надо больше памяти.
|
|
|
|
14.06.2013, 14:25
|
|
|
Гражданин KAZUS.RUN
Регистрация: 03.02.2007
Сообщений: 116
Сказал спасибо: 3
Сказали Спасибо 20 раз(а) в 9 сообщении(ях)
|
Re: Определение младшего и старшего байта числа типа int. Нужна подсказка
Сообщение от AlexPi
|
|
Если Вы знаете такой проц. который за одну инструкцию способен сделать сдвиг слова на n разрядов
|
Intel. По крайней мере с 286...
__________________
Здесь вам не тут!
|
|
|
|
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.
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:51.
|
|