реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Поменять местами биты в байте.
ps1x
сообщение May 9 2007, 09:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Допустим есть

0bXY000000.

Как сделать

0bYX000000?

Надо использовать битовые маски и логические операции, только вот с масками никак не разберусь...

И еще, есть ли в CVAVR функция, возвращающая № буквы, т.е. типа chr("a")=35 ?

С уважением.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 9 2007, 10:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(ps1x @ May 9 2007, 12:43) *
Допустим есть
0bXY000000.
Как сделать
0bYX000000?

xxx = ((xxx>>1)|(xxx<<1))&0xC0;
Цитата
И еще, есть ли в CVAVR функция, возвращающая № буквы, т.е. типа chr("a")=35 ?

Обалдеть sad.gif
1. "a" - это стринг, а 'буква' это 'a'
2. 'a' это и есть 'номер буквы'


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ps1x
сообщение May 9 2007, 10:36
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Цитата(zltigo @ May 9 2007, 13:22) *
xxx = ((xxx>>1)|(xxx<<1))&0xC0;

Обалдеть sad.gif
1. "a" - это стринг, а 'буква' это 'a'
2. 'a' это и есть 'номер буквы'

да нет, имелось ввиду номер буквы в таблице ASCII
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 9 2007, 10:46
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(ps1x @ May 9 2007, 13:36) *
да нет, имелось ввиду номер буквы в таблице ASCII

sad.gif sad.gif sad.gif sad.gif
Я догадался, что имелось ввиду и дал ПРАВИЛЬНЫЙ ответ.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 9 2007, 11:47
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(ps1x @ May 9 2007, 18:36) *
да нет, имелось ввиду номер буквы в таблице ASCII

А как Вы собираетесть использовать этот номер? Если внутри программы, то так и пишите 'a', 'b', 's' и что угодно и считайте, что это константы.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
ps1x
сообщение May 9 2007, 12:16
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Цитата(haker_fox @ May 9 2007, 14:47) *
А как Вы собираетесть использовать этот номер? Если внутри программы, то так и пишите 'a', 'b', 's' и что угодно и считайте, что это константы.

У меня есть самодельный алфавит для английских букв, и я хочу его выводить на светодиодный индикатор используя что нибудь типа display("hello world");
Для того чтобы брать данные из алфавита, мне надо парсить строку на буквы (ну это просто), а буквы на цифры, чтобы вычислить позицию данных в массиве алфавита.
Go to the top of the page
 
+Quote Post
Serg76
сообщение May 9 2007, 12:23
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(zltigo @ May 9 2007, 13:22) *
xxx = ((xxx>>1)|(xxx<<1))&0xC0;

Обалдеть sad.gif
1. "a" - это стринг, а 'буква' это 'a'
2. 'a' это и есть 'номер буквы'

Как мне видится надо сделать так:

xxx = 0b XY00 0000; // условие
xxx = (xxx&0x33f) | ( ( (xxx&0x80)>>1) | ( (xxx&0x40)<<1) );

тогда остальные биты остануться в живых
Go to the top of the page
 
+Quote Post
ps1x
сообщение May 9 2007, 13:24
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Цитата(Serg76 @ May 9 2007, 15:23) *
Как мне видится надо сделать так:

xxx = 0b XY00 0000; // условие
xxx = (xxx&0x33f) | ( ( (xxx&0x80)>>1) | ( (xxx&0x40)<<1) );

тогда остальные биты остануться в живых


Я это сделал так:
xxx = (((xxx>>1)|(xxx<<1))&xxx&0xBF)^0b01000000;
Go to the top of the page
 
+Quote Post
Serg76
сообщение May 9 2007, 14:44
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(ps1x @ May 9 2007, 16:24) *
Я это сделал так:
xxx = (((xxx>>1)|(xxx<<1))&xxx&0xBF)^0b01000000;

Прошу прощения, но по-моему сильно мудрЕно и, как мне кажется, неверно. Смотрите:

при взаимных сдвижках - (xxx>>1)|(xxx<<1) без предварительного выделения нужных бит X и Y с помощью маскирования (xxx&0x80), (xxx&0x40) и последующего сложения ИЛИ непременно возникнет ошибка (Y | b = ????????). Попробуем проследить ход операций:
1. Сдвижка xxx на бит вправо даст 00 bXY0 0000;
2. Сдвижка xxx на бит влево даст bX Y000 0000;
3. После ИЛИ непонятно вообще что получится.

А далее я что-то тоже не понял: ...&xxx&0xBF)^0b01000000;

Если бы мы имели дело с регистром вида 00XY000000, то проканал бы и вариант zltigo, а так у нас имеется еще бит 'b', который как я понимаю может принимать любое значение. Поэтому мой вариант является универсальным, даже если на всех остальных позициях, кроме XY, будут биты с различными значениями.
Go to the top of the page
 
+Quote Post
Laksus
сообщение May 9 2007, 15:00
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата(Serg76 @ May 9 2007, 14:23) *
Как мне видится надо сделать так:

xxx = 0b XY00 0000; // условие
xxx = (xxx&0x33f) | ( ( (xxx&0x80)>>1) | ( (xxx&0x40)<<1) );

тогда остальные биты остануться в живых

Наверное у Вас опечатка и имелось в виду так:
xxx = (xxx&0x3f) | (((xxx&0x80)>>1) | ((xxx&0x40)<<1)));
________________________
А это, неправильно
Цитата(ps1x @ May 9 2007, 15:24) *
Я это сделал так:
xxx = (((xxx>>1)|(xxx<<1))&xxx&0xBF)^0b01000000;


Сообщение отредактировал Laksus - May 9 2007, 15:03
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 9 2007, 15:16
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Serg76 @ May 9 2007, 17:44) *
....то проканал бы и вариант zltigo,...

Нет. В исходном задании был конкретно описано 8bit (не 10)значение с шестью нулевыми младшими битами. Все прочие фантазии, пожалуйста, оставьте при себе.
Цитата
а так у нас имеется еще бит 'b', который как я понимаю может принимать любое значение.

Не имеется. 0b1100000 equ 0xC0 вот такие дела.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xemul
сообщение May 9 2007, 15:27
Сообщение #12



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Тупое решение в лоб
Код
t = x;
x &= 0x3f;
if(t & (1<<6)) x |= 1<<7;
if(t & (1<<7)) x |= 1<<6;

дает не худший расход памяти и более компактный код и под PIC, и под AVR. На ассемблере можно обойтись без временных переменных.

2ps1x есть алфавит, есть индикатор, между ними нужно впихнуть знакогенератор. Для решение задачи требуется только место в ПЗУ под знакогенератор. В какое место знакогенератора можно пристроить интересовавшую Вас функцию, мне непонятно.
Go to the top of the page
 
+Quote Post
Edmundo
сообщение May 9 2007, 15:30
Сообщение #13


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



Цитата(Serg76 @ May 9 2007, 18:44) *
1. Сдвижка xxx на бит вправо даст 00 bXY0 0000;
2. Сдвижка xxx на бит влево даст bX Y000 0000;
... а так у нас имеется еще бит 'b', который как я понимаю может принимать любое значение...

OFF
А сдвиг 0xC0 на 4 бита вправо дает 00xC smile.gif
Вначале думал, что вы шутите... смеялся smile.gif


--------------------
شامل
Go to the top of the page
 
+Quote Post
Visor
сообщение May 10 2007, 13:07
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 240
Регистрация: 23-03-07
Пользователь №: 26 428



Есть такой флаг "Т", вот через него можно легко гонять биты регистров, с помощью команд BST и BLD. Но это асм, который не все жалуют. cool.gif
Go to the top of the page
 
+Quote Post
Punk
сообщение May 10 2007, 14:06
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



Цитата(ps1x @ May 9 2007, 12:43) *
Допустим есть

0bXY000000.

Как сделать

0bYX000000?

Надо использовать битовые маски и логические операции, только вот с масками никак не разберусь...

И еще, есть ли в CVAVR функция, возвращающая № буквы, т.е. типа chr("a")=35 ?

С уважением.


Хотел бы порекомендовать замечательную книжку: Генри Уоррен, мл. *Алгоритмические трюки для программистов* там есь ответы на все "битовые" вопросы
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01565 секунд с 7
ELECTRONIX ©2004-2016