Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как записать число? Как использовать сдвигающий регистр?  (Прочитано 11254 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Vitalya25
Интересующийся

ua
Offline Offline

« : 28-01-2010 13:05 » 

Здравствуйте! Мне нужно записать число на карточку (размер числа от 0 до FFFFFFFF). У меня есть 4 ячейки памяти,  которые я могу использовать для записи этого числа. Но максимальное число, которое можно записать в одну ячейку FF. Как мне объединить все ячейки в одну или как по-другому решить мою проблему? Суть такова, что я ввожу десятичное число в интерфейсе, потом оно преобразуется в 16-тиричное. К примеру, я ввожу 10-тичное число 458678252, и оно преобразуется в 16-тиричное 1B56DFEC.
Как сделать так, чтобы из числа 1B56DFEC:
1B записало в первую ячейку,
56 во вторую,
DF - в третью,
а EC соответственно в четвертую.

 
Объясните, пожалуйста! Улыбаюсь
« Последнее редактирование: 28-01-2010 13:13 от Sel » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #1 : 28-01-2010 13:13 » 

что значит "записать число на карточку", о чем собственно речь?
Записан

С уважением Lapulya
Vitalya25
Интересующийся

ua
Offline Offline

« Ответ #2 : 28-01-2010 15:52 » 

та собственно уже разобрался со сдвигом типа этого:
m_nDOut[3] = (BYTE)m_nDOutNomerPacienta;
m_nDOutNomerPacienta = m_nDOutNomerPacienta>>8;
m_nDOut[2] = (BYTE)m_nDOutNomerPacienta;
m_nDOutNomerPacienta = m_nDOutNomerPacienta>>8;
m_nDOut[1] = (BYTE)m_nDOutNomerPacienta;
m_nDOutNomerPacienta = m_nDOutNomerPacienta>>8;
m_nDOut[0] = (BYTE)m_nDOutNomerPacienta;
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 28-01-2010 16:02 » 

вариант 1, безопасный
Код:
::memmove(m_nDOut,&m_nDOutNomerPacienta,min(N,sizeof(m_nDOutNomerPacienta));
//где N - максимальныей размер (в байтах) массива m_nDOut

вариант 2, чуть менее безопасный ( при уверенности, что массив как минимум размером sizeof(TYPE))
Код:
*((TYPE*)m_nDOut)=m_nDOutNomerPacienta;
//где TYPE - тип переменной m_nDOutNomerPacienta. Тип простой, допускающий тупо побайтовое копирование

« Последнее редактирование: 28-01-2010 16:06 от Алексей1153++ » Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 29-01-2010 05:50 » 

Алексей1153++, боюсь ты не понял задачи Улыбаюсь
Vitalya25, а боюсь не в курсе, как устроена память и как в ней размещаются элементы Улыбаюсь

Как сделать так, чтобы из числа 1B56DFEC:
1B записало в первую ячейку,
56 во вторую,
DF - в третью,
а EC соответственно в четвертую.

тебя именно такой порядок интересует или устроит и обратный?
дело в том, что число 1B56DFEC и так лежит в 4-х смежных ячейках и если тебе не нужно менять порядок байт(в большинстве случае это именно так), то достаточно просто скопировать число поверх массива, а можно не копировать, а интерпретировать число, как массив из четырёх байт.
Код:

int main(int argc, char* argv[])
{

{ // интерпритеруем long, как массив char
std::cout << "interpret\t";
long l = 458678252;
unsigned char * c = reinterpret_cast<unsigned char*>(&l);

for (size_t i = 0; i != 4; ++i)
std::cout << std::hex << static_cast<long>(c[i]) << " ";
}
std::cout << std::endl;
{ // меняем порядок байт в цикле
std::cout << "loop reorder\t";
long l = 458678252;
unsigned char c[4] = {0};
unsigned char * c2 = reinterpret_cast<unsigned char*>(&l);
for (size_t i = 0; i != 4; ++i)
c[i] = c2[3-i];

for (size_t i = 0; i != 4; ++i)
std::cout << std::hex << static_cast<long>(c[i]) << " ";
}
std::cout << std::endl;
{ // копируем через оператор =
std::cout << "operator=\t";
long l = 458678252;
unsigned char c[4] = {0};
*reinterpret_cast<long*>(c) = l;

for (size_t i = 0; i != 4; ++i)
std::cout << std::hex << static_cast<long>(c[i]) << " ";
}

std::cout << std::endl;
{ // копируем через memcpy
std::cout << "memcpy\t\t";
long l = 458678252;
unsigned char c[4] = {0};
memcpy(c, &l, 4);
*reinterpret_cast<long*>(c) = l;

for (size_t i = 0; i != 4; ++i)
std::cout << std::hex << static_cast<long>(c[i]) << " ";
}
std::cout << std::endl;
{ // меняем порядок байт сдвигом
std::cout << "shift reorder\t";
long l = 458678252;
unsigned char c[4] = {0};
c[3] = (BYTE)l;
l = l>>8;
c[2] = (BYTE)l;
l = l>>8;
c[1] = (BYTE)l;
l = l>>8;
c[0] = (BYTE)l;

for (size_t i = 0; i != 4; ++i)
std::cout << std::hex << static_cast<long>(c[i]) << " ";
}

return 0;
}

результаты:
Код:
interpret       ec df 56 1b
loop reorder    1b 56 df ec
operator=       ec df 56 1b
memcpy          ec df 56 1b
shift reorder   1b 56 df ec
« Последнее редактирование: 29-01-2010 06:09 от LogRus » Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 29-01-2010 06:02 » 

LogRus, ну я про интеловский порядок ) Если наоборот, то переставить байты зеркально, а потом так же.

Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 29-01-2010 06:11 » 

немного поправил эксперимент для удобочитаемости
Алексей1153++, Улыбаюсь
Записан

Странно всё это....
Vitalya25
Интересующийся

ua
Offline Offline

« Ответ #7 : 09-02-2010 13:42 » 

А помогите еще с сложением hex чисел, НО мне надо чтобы они складывались именно так:

1B+56+DF+EC=1B56DFEC

У меня числа 1B, 56, DF, EC записались каждое в свою ячейку. И получается когда я хочу вывести на экран в интерфейсе эти числа в Dec формате, у меня число 1B56DFEC выводится как 27 86 223 236 (т.е. преобразует в dec отдельно взятую пару чисел), вместо нужного dec числа 458678252.
« Последнее редактирование: 09-02-2010 13:55 от Vitalya25 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 09-02-2010 13:54 » 

Vitalya25, ты понимаешь разницу между числом, как оно записано в ячейках памяти, и его символьным представлением с форматированием?

И получается когда я хочу вывести на экран в интерфейсе эти числа в Dec формате, у меня число 1B56DFEC выводится как 27 86 223 236

Как именно ты выводишь это число?
« Последнее редактирование: 09-02-2010 13:56 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Vitalya25
Интересующийся

ua
Offline Offline

« Ответ #9 : 17-02-2010 13:36 » 

спасибо, разобрался (на половину). число я вывожу так:

StrMsg.Format("Номер пациента: %d ", m_nDOut[2]*256+m_nDOut[3] );
LstIndx =  m_List.AddString(StrMsg);

Выводится на экран число только из двух ячеек (в которых записано DF и EC). Т.е. на экран выводится число 57324 (DFEC).
 
Но, мне нужно чтобы выводилось число из всех ячеек, т.е. что-то типа этого должно быть:
StrMsg.Format("Номер пациента: %d ", m_nDOut[0]*256^3+m_nDOut[1]*256^2+m_nDOut[2]*256+m_nDOut[3] );
LstIndx =  m_List.AddString(StrMsg);

если там записано число больше 65536, то оно обрезается при выводе его на экран...
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 17-02-2010 13:52 » 

Vitalya25, учи мат.часть. Стыдоба.
банальное непонимание базовых принципов.

Код:
long num = static_cast<long>(m_nDOut[0])<<24;
num += static_cast<long>(m_nDOut[1])<<16;
num += static_cast<long>(m_nDOut[2])<<8;
num = m_nDOut[3];

StrMsg.Format("Номер пациента: %d ", num);
Записан

Странно всё это....
Vitalya25
Интересующийся

ua
Offline Offline

« Ответ #11 : 16-11-2010 16:42 » 

Спасибо! разобрался с этим!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines