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

Поиск:

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


Unregistered











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


Эксперт
****


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

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



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


--------------------
Цитата(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
Всего: 165



Код

#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   Вверх
Alex101
Дата 22.7.2004, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(chipset @ 22.7.2004, 09:19)
Выводит ноль sad.gif

А r чему равно перед присваиванием?
Да, int надо unsigned
(В этом примере нормально должно быть по-любому 5F, а так - может отрицательное число получиться)
Добавлено @ 15:34
Поставьте дополнительные скобки.


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


Лентяй 2
***


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

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



Код

_asm
{push eax
 push ebx
 mov al, Входной байт
 mov ah,al
 ror al,1
 rol ah,1
 mov bx,ax
 rol bh,2
 ror bl,2
 and ax,1188h
 and bx,2244h
 or ax,bx
 or al,ah
 mov Зеркальный байт,al
 pop ebx
 pop eax}



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
oleg1973
Дата 22.7.2004, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


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

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



Alex101
а ну да чета я ступил sad.gif


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0923 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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