Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2009, 02:12   #1
Dayne
 
Регистрация: 18.03.2009
Сообщений: 6
По умолчанию Битовые операции с float

Доброго времени суток.
Столкнулся с ситуацией когда надо отдельно выдернуть части из переменной типа float.
Например, имеется некоторая переменная
Код:
float someFloat;
и переменные куда будут занесены ее отдельные части
Код:
int znak; // значение старшого бита. Тут собственно особых проблем нет - сравнение с нулем
int poryadok; //следующих 8 бит
int mantisa; // оставшиеся 23 бита
Вся проблема в том что логические сума, произведение и сдвиги неприменимы к float и double. Будьте добры - посоветуйте как ее решить.
Dayne вне форума Ответить с цитированием
Старый 24.06.2009, 04:34   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

я бы сделал inline ассемблером:
Код:
test [someFloat],80000000h
jne next0
mov [znak],1
next0:
mov eax,[someFloat]
push eax
shr,23 ;в результате нужные нам 8 бит окажутся в al
movsx eax,al
mov [poryadok],eax
pop eax
rcr eax,24 ;двигаем по кругу наше число что бы в al оказались старшие 8 бит.
xor al,al ;обнуляем неугодных :)
rcl eax,24
and eax,7FFFFFFFh ; зануляем ненужный нам лишний бит порядка. 
mov [mantissa],eax.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 24.06.2009, 05:43   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Код:
union MyFloat
{
  float asFloat;
  long int asInteger;
};

MyFloat testFloat;
testFloat.asFloat = someFloat;

int znak = testFloat.asInteger >> 31;
int poryadok = (testFloat.asInteger >> 23) & 0xFF;
int mantissa = testFloat.asInteger & 0x7FFFFF;
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции, проблемы Sashko Общие вопросы C/C++ 2 27.03.2009 17:28
битовые операции, Pascal TOSAgrk Помощь студентам 2 02.02.2009 17:41
Битовые операции DrAlexx2121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.06.2008 22:26
Битовые операции LEX.darnica Помощь студентам 14 23.12.2007 19:40
Битовые операции zetrix Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 15.12.2006 11:08