|
Поменять местами биты в байте. |
|
|
|
May 9 2007, 10:22
|

Гуру
     
Группа: Свой
Сообщений: 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 ? Обалдеть  1. "a" - это стринг, а 'буква' это 'a' 2. 'a' это и есть 'номер буквы'
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 9 2007, 10:36
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(zltigo @ May 9 2007, 13:22)  xxx = ((xxx>>1)|(xxx<<1))&0xC0; Обалдеть  1. "a" - это стринг, а 'буква' это 'a' 2. 'a' это и есть 'номер буквы' да нет, имелось ввиду номер буквы в таблице ASCII
|
|
|
|
|
May 9 2007, 12:16
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(haker_fox @ May 9 2007, 14:47)  А как Вы собираетесть использовать этот номер? Если внутри программы, то так и пишите 'a', 'b', 's' и что угодно и считайте, что это константы. У меня есть самодельный алфавит для английских букв, и я хочу его выводить на светодиодный индикатор используя что нибудь типа display("hello world"); Для того чтобы брать данные из алфавита, мне надо парсить строку на буквы (ну это просто), а буквы на цифры, чтобы вычислить позицию данных в массиве алфавита.
|
|
|
|
|
May 9 2007, 12:23
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
Цитата(zltigo @ May 9 2007, 13:22)  xxx = ((xxx>>1)|(xxx<<1))&0xC0; Обалдеть  1. "a" - это стринг, а 'буква' это 'a' 2. 'a' это и есть 'номер буквы' Как мне видится надо сделать так: xxx = 0b XY00 0000; // условие xxx = (xxx&0x33f) | ( ( (xxx&0x80)>>1) | ( (xxx&0x40)<<1) ); тогда остальные биты остануться в живых
|
|
|
|
|
May 9 2007, 13:24
|
Местный
  
Группа: Свой
Сообщений: 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;
|
|
|
|
|
May 9 2007, 14:44
|
Профессионал
    
Группа: Участник
Сообщений: 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, будут биты с различными значениями.
|
|
|
|
|
May 9 2007, 15:00
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 9 2007, 15:16
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 9 2007, 15:27
|
    
Группа: Свой
Сообщений: 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. На ассемблере можно обойтись без временных переменных. 2 ps1x есть алфавит, есть индикатор, между ними нужно впихнуть знакогенератор. Для решение задачи требуется только место в ПЗУ под знакогенератор. В какое место знакогенератора можно пристроить интересовавшую Вас функцию, мне непонятно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|