Реверс битового значения.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Реверс битового значения.

Реверс битового значения.

Ответ
Поиск в этой теме
Непрочитано 17.09.2013, 22:30 #1
Реверс битового значения.
Дима_
 
Продуман
 
Питер
Регистрация: 22.02.2007
Сообщений: 2,839

Всем здравствуйте. Вопрос совсем не по автокаду, но может простят меня и не забанят. Внезапно понадобилось мне осуществить разворот битового представления числа (то есть, например, из 11001010 получить 01010011) и что очень желательно сделать это при помощи коомбинации элементарных операций (математических и логических + - * / and or и.т.д). Варианты типа превести в массив и прочитать с конца меня коребят по сути своей. Надо запрограммировать на "левом" процессоре на котором практически ничего нет. А в этой области я порядком все подзабыл и "наскоком" не получается (старею что-ли?) - может подскажет кто.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Просмотров: 6448
 
Непрочитано 17.09.2013, 22:38
#2
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>математических и логических + - * / and or и.т.д
помоему невыйдет.
>>Надо запрограммировать на "левом" процессоре на котором практически ничего нет
побитовые сдвиги там есть? "сдвигаеш" влево - "вдвигвешь" вправо ну или наоборот. и так 8 раз
zamtmn вне форума  
 
Автор темы   Непрочитано 17.09.2013, 22:55
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
побитовые сдвиги там есть?
да они по моему везде есть (это по сути умножить и поделить на 2) - только при сдвиге (как и везде) крайние биты теряются да и порядок по Вашему алгоритму не изменится что было, то и получим - или я чего не так понял?
з.ы. и про 8 раз - это вы от себя додумали, но не суть.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.09.2013, 22:57
#4
swell{d}

гадание на конечно-элементной гуще
 
Регистрация: 31.05.2006
Düsseldorf
Сообщений: 7,596


Тут нужна помощь арабов
__________________
.: WikiЖБК + YouTube :.
swell{d} вне форума  
 
Автор темы   Непрочитано 17.09.2013, 23:11
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Арабы помогите...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.09.2013, 23:13
#6
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


В ассемблере Z80 была команда сдвига с выводом "пропадающего" бита в флаг переноса и соответствующий аналог с вводом из оного флага. в 8086 тоже помоему была, но на нем я не злоупотреблял. Смотрите систему команд.
Соответственно и сдвигов получится 8 по одному биту - в примере вы привели "11001010"
>>или я чего не так понял?
выводим в одну сторону, вводим в другую - порядок меняется, проблема в наличии команд не "теряющих" биты
Если такой команды нет то чтото навроди такого "паскального" псевдокода
Код:
[Выделить все]
function reverse(data:byte):byte
var
   i,testmask,setmask:byte;
begin
  testmask:=0B10000000;
  setmask:=0B00000001;
  result:=0;
  for i:=0 to 7 do
  begin
    if (data and testmask)>0 then
      result:=result or setmask;
    shl(setmask);//двигаем влево
    shr(tetmask);//двигаем вправо 
  end;
end;
И цикл тоже 8 раз))
>>Варианты типа превести в массив и прочитать с конца меня коребят по сути своей
собственно это тоже, но без массива. Подругому ИМХО никак

Последний раз редактировалось zamtmn, 17.09.2013 в 23:21.
zamtmn вне форума  
 
Непрочитано 17.09.2013, 23:27
1 | #7
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515



gomer вне форума  
 
Непрочитано 18.09.2013, 00:17
#8
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Арабы помогите...
Просил арабов?
Смотри предпоследний пример:
http://stackoverflow.com/questions/7...o-lsb-msb-in-c
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 18.09.2013, 01:13
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


да с тем ассемблером я на ты, но видимо действительно без побитового прогона никак
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.09.2013, 08:49
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Внезапно понадобилось мне осуществить разворот битового представления числа (то есть, например, из 11001010 получить 01010011) и что очень желательно сделать это при помощи коомбинации элементарных операций (математических и логических + - * / and or и.т.д).
Например так:

Код:
[Выделить все]
#include <stdio.h>
int main(){
	int x = 202; // 11001010 (202)
	int r = 0;
	for(int i = 7, k = 0; i >=0; --i, k++) r |= ((x >> i) & 1) << k;		
	printf("%i\n",r); // 01010011 (83)
	return 0;
}
Цитата:
Сообщение от Дима_
видимо действительно без побитового прогона никак
да, только в цикле. Это если бы тебе нужно было местами поменять старшие 4 бита и 4 младшие, тогда можно было бы ограничиться банальным сдвигом. А так только побитно (насколько я знаю).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 18.09.2013, 09:00
#11
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Что значит - "левом" процессоре, не понятно, но я делаю так:
strStroka = StrReverse(strStroka)
maratovich вне форума  
 
Непрочитано 18.09.2013, 09:04
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от maratovich Посмотреть сообщение
Что значит - "левом" процессоре, не понятно
На "левом", скорее всего означает, что на чём-то вроде старого микроконтроллера.
Цитата:
Сообщение от maratovich Посмотреть сообщение
я делаю так:
strStroka = StrReverse(strStroka)
Причём здесь строка? Внимательней читай, о чём автор спрашивает:
Цитата:
Сообщение от Дима_
Внезапно понадобилось мне осуществить разворот битового представления числа (то есть, например, из 11001010 получить 01010011) и что очень желательно сделать это при помощи коомбинации элементарных операций (математических и логических + - * / and or и.т.д).
@Дима_,
А вообще зачем реверс битов понадобился? Может было бы проще непосредственно, сразу обращаться к нужному биту, раз ты всё равно знаешь его позицию в байте (я так понял, что биты используются тобой в качестве флагов)?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 18.09.2013 в 09:13.
hwd вне форума  
 
Автор темы   Непрочитано 18.09.2013, 10:27
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


maratovich да "левый" - это микроконтроллер.
hwd да там через порты очень хорошо все машинное слово сразу ложится (потому как раз и не хочется по биту дергать) - на самом деле там, что называется из двух зол - либо ноги микросхемы перекрестно соединяй, либо слово (машинное) переворачивай (процессорного времени там достаточно - но блин как-то коряво побитово такую ерунду делать - вдруг чего еще добавится), а "хардово" - хоть верх ногами микросхему подвешивай - вобщем если "красиво" биты развернуть не удасться (я еще над основным алгоритмом подумаю - может там где "лазейка" есть при подготовке данных) - наверное "через ноги".
з.ы. все вроде решил (в другом месте программы нашел где "развернуть").
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 18.09.2013 в 11:24.
Дима_ вне форума  
 
Непрочитано 18.09.2013, 11:39
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
но блин как-то коряво побитово такую ерунду делать - вдруг чего еще добавится
На тот случай, если может потребоваться реверс битов для данных разной величины, можно написать шаблонную функцию и использовать её:
Код:
[Выделить все]
/*
sample.cpp
C++
© Hwd, 2013
*/
#include <iostream>
using namespace ::std;
template<class T> T reverse_bits(T val);

// Примеры использования функции reverse_bits.
int main(){
	char a(202); // 11001010 (202)
	cout << "char(202): " << (int) reverse_bits(a) << endl; 
	unsigned short b(202);
	cout << "unsigned short(202): " << reverse_bits(b) << endl;
	unsigned int c(202);
	cout << "unsigned int(202): " << reverse_bits(c) << endl;
	unsigned long d(202);
	cout << "unsigned long(202): " << reverse_bits(d) << endl;
	unsigned long long e(202);
	cout << "unsigned long long(202): " << reverse_bits(e) << endl;
	return 0;
}
// Шаблонная функция по реверсу битов
template<class T> T reverse_bits(T val){	
	T r(0);
	for(int i = sizeof(T) * 8 - 1, k = 0; i >=0; --i, k++) r |= ((val >> i) & 1) << k;
	return r;
}
Если под твой микроконтроллер на C++ писать нет возможности (мало ли), то на C придётся написать несколько перегруженных вариантов функции для каждого из обозначенных мною выше типов (с этим проблем у тебя возникнуть не должно). Ну или заморачиваться с физическими "лапками", как ты и собирался...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 18.09.2013 в 12:11.
hwd вне форума  
 
Непрочитано 18.09.2013, 12:21
#15
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


hwd
Шаблоны на микроконтроллере? Это называется всунуть просто потому что оно есть. И есть ли компилятор срр для того контроллера?
Обычная функция с передачей кол-ва байтов (или битов) которые нужно развернуть подойдет куда лучше
zamtmn вне форума  
 
Непрочитано 18.09.2013, 12:23
#16
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
hwd
Шаблоны на микроконтроллере? Это называется всунуть просто потому что оно есть. И есть ли компилятор срр для того контроллера?
Обычная функция с передачей кол-ва байтов (или битов) которые нужно развернуть подойдет куда лучше
Порой лучше жевать, чем говорить. Почитай, что такое шаблоны и какой код генерируется на их основе.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 18.09.2013, 12:28
#17
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Порой лучше жевать, чем говорить. Почитай, что такое шаблоны и какой код генерируется на их основе.
Аналогично. Попрогай на асемблере (думаю на нем этот контроллер и програмируется) и пойми что там на типобезопасност в compiletime плевать.

>>то на C придётся написать несколько перегруженных вариантов функции для каждого из обозначенных мною выше типов
Очень верное решение для очень тесной памяти мк))
zamtmn вне форума  
 
Автор темы   Непрочитано 18.09.2013, 12:36
#18
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Друзья не ругайтесь - еслиб работа с этим контроллером предстояла большая, то можно-бы было оценить трудозатраты на транслятор со Scheme например (мне она ближе будет), а так овчинка выделки не стоит. На контроллере что-то похожее на Си, которой плевать не только на типобезопасность, но и вобще на все.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Реверс битового значения.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Схемы сдвига грунта в геологическом отчете. Какие принимать значения для сцепления и угла внутреннего трения при различных схемах сдвига? kuatro777 Основания и фундаменты 6 24.10.2013 00:52
Учет значения ускорение свободного падения при расчете стенки ЖБ резервуара bambbucha Железобетонные конструкции 23 26.02.2013 01:40
AutoCAD Civil 3D 2012 Rus. Значение пользовательских свойств сбрасываются в значения по умолчанию. TararykovDG Вертикальные решения на базе AutoCAD 11 13.02.2013 16:39
Программная вставка блока с атрибутами в таблицу. Как сохранить установленные значения атрибутов? Кулик Алексей aka kpblc Программирование 8 22.07.2010 15:01
Нормоконтроль и Пояснительная записка! Shtrih Разное 8 08.07.2009 22:29