Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно зеркально отобразить байт 
:(
    Опции темы
Serenum
Дата 22.7.2004, 08:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дело в следующем, данные из последовательного порта записываются в память наоборот слева направо. Нужно написать программу, или может функция есть специальная, чтобы перевести число в нормальный вид. Помогите, я на С только начинаю... withstupid.gif
  Вверх
chipset
Дата 22.7.2004, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Делай маски в шестнацетиричном формате затем побитовой функцией & разделяй на биты и | собирай..
Может кто знает более правильный и красивый способ..


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
maxim1000
Дата 22.7.2004, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Код
unsigned char mirror(unsigned char x)
{
 unsigned char result=0;
 int c;

 for(c=0;c<8;c++)
 {
   result<<=1;
   if(x&1)
     result++;
   x>>=1;
 }
}

только я не проверял smile.gif


--------------------
qqq
PM WWW   Вверх
Alex101
Дата 22.7.2004, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Код
unsigned char mirror(unsigned char x)
{
unsigned char result=0;

for(int i=0;i<4;i++)
result+=(((x<<i)&1)>>(7-i)+(((x<<(7-i))&1)>>i)

return result;
}

Проверить не на чем.
Не уверен в скобках, но работать должно.

Это сообщение отредактировал(а) Alex101 - 22.7.2004, 11:54


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Guest
Дата 22.7.2004, 11:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











chipset
maxim1000

Ребят, можете поподробнее объяснить, что вы предлагаете. Т. е, извлечено число из порта, присвоено переменной , и дальше словами алгоритм, мне так понятнее будет. И по русски плиз, я в программерскую феню еще не до конца въезжаю.
  Вверх
Serenum
Дата 22.7.2004, 11:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Alex101

А почему в цикле четыре прохода?
  Вверх
Alex101
Дата 22.7.2004, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Цитата(Serenum @ 22.7.2004, 08:56)
Alex101

А почему в цикле четыре прохода?

Больше не надо. Если надо перевернуть 8-и битное число, то идем до середины и меняем симметричные биты.

P.S.
Проверьте, работает? (Просто самому интересно, сейчас C нет, а в нашем языке нет операций сдвига).


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
<Spawn>
Дата 22.7.2004, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



можешь функцию из Winsock исользовать, а именно ntohl, если я не правильно помню(если не то, то сморти htonl)

Это сообщение отредактировал(а) <Spawn> - 22.7.2004, 12:14


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
maxim1000
Дата 22.7.2004, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
Ребят, можете поподробнее объяснить, что вы предлагаете. Т. е, извлечено число из порта, присвоено переменной , и дальше словами алгоритм, мне так понятнее будет. И по русски плиз, я в программерскую феню еще не до конца въезжаю.

аналогия:
есть стопка книг
алгоритм такой:
1. взять верхнюю книгу и положить справа (там где должна быть перевернутая стопка)
2. повторить (1) столько раз, сколько книг в стопке
получится перевернутая стопка книг...


--------------------
qqq
PM WWW   Вверх
chipset
Дата 22.7.2004, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Код

#include <iostream>
using namespace std;
unsigned char mirror(unsigned char x)
{
unsigned char result=0;

for(int i=0;i<4;i++)
 result+=(((x<<i)&1)>>(7-i)+(((x<<(7-i))&1)>>i));

 return result;
}
void main () {
unsigned char x = 0xFA;
unsigned char r = mirror(x);
int i = (int)r;
cout<<i<<endl;
system("PAUSE");
}

Выводит ноль sad.gif

Это сообщение отредактировал(а) chipset - 22.7.2004, 12:40


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Guest
Дата 22.7.2004, 12:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











<Spawn>

Мне под DOS надо...


maxim1000


Цитата
аналогия:
есть стопка книг
алгоритм такой:
1. взять верхнюю книгу и положить справа (там где должна быть перевернутая стопка)
2. повторить (1) столько раз, сколько книг в стопке
получится перевернутая стопка книг...

Это все понятно, но поближе к Си, пжста?
  Вверх
oleg1973
Дата 22.7.2004, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



кароче я так понимаю проблему
имеем байт
11110000
нада из него сделать
00001111

делаем
_asm
{
mov al,наш байт
rol al,4
}


получим че хотели

Это сообщение отредактировал(а) oleg1973 - 22.7.2004, 12:57


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Hroft
Дата 22.7.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Код

#include <iostream>

typedef int my_type;
const unsigned int my_type_size = sizeof(my_type) * 8;

void out_bits(my_type number)
{
       // служебная конкретная единица
       my_type my_1 = static_cast<my_type>(1);
       // цикл по всем битам
       for (int i=0;i<my_type_size;++i) {
               // если бит установлен - вывести единицу, иначе ноль
               if ((number & (my_1 << i)) != 0) {
                       std::cout<<"1";
               } else {
                       std::cout<<"0";
               }
       }
       std::cout<<"\n";
}

my_type rev_bits(my_type number)
{
       my_type res = 0;
       my_type my_1 = static_cast<my_type>(1);
       for (int i=0;i<my_type_size;++i) {
               if ((number & (my_1 << i)) != 0) {
                       // накапливаем в res, но сдвигаем не на позицию текущего бита,
                       // а на длину битового представления минус позицию - собственно
                       // инвертирование
                       res |= my_1 << (my_type_size - 1 - i);
               }
       }
       return res;
}

int main()
{
       my_type number = 43;
       out_bits(number);
       out_bits(rev_bits(number));
       return 0;
}

Криво, быть может, но вроде работает. Прямой подход, без премудростей.
PM MAIL ICQ   Вверх
Alex101
Дата 22.7.2004, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Цитата(oleg1973 @ 22.7.2004, 09:54)
кароче я так понимаю проблему
имеем байт
11110000
нада из него сделать
00001111

делаем
_asm
{
mov al,наш байт
rol al,4
}


получим че хотели

Это будет работать только для твоего примера.
Команда ROL осуществляет сдвиг влево + переносит старший бит в младший.
А тут надо зеркально отобразить, например: 10110011->11001101


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
maxim1000
Дата 22.7.2004, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
кароче я так понимаю проблему
имеем байт
11110000
нада из него сделать
00001111

делаем
_asm
{
mov al,наш байт
rol al,4
}

если человек сказал, что он на С только начинает, это еще не значит, что до этого он программировал на ассемблере biggrin.gif
Цитата
Это все понятно, но поближе к Си, пжста?

фрагмент
Код
  if(x&1)
    result++;

просто проверяет младший бит x, и если он 1, то добавляет его к result
Код
result<<=1;

сдвигает result влево на один бит (освобождает место для следующего)
Код
x>>=1;

сдвигает x вправо на один бит (делает младшим следующий)
вообще полезно было бы запустить все это в отладочнике и пройтись пошаговым выполнением...


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0952 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.