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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2013, 21:35   #1
КРИЖ
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 44
По умолчанию как правильно занулить бит,который определяет знак, в типе double

я как понимаю надо сделать сдвиг одного бита влево, а потом в право и он занулится. только есть проблема как это сделать. так как побитовый сдвиг >>(<<)можно использовать только для типа int.
хотелось бы пример к комментариями чтобы разобраться.
спасибо тому кто поможет)
КРИЖ вне форума Ответить с цитированием
Старый 22.11.2013, 21:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
так как побитовый сдвиг >>(<<)можно использовать только для типа int.
Это не совсем правда. вещественный тип тоже представляет из себя байты и биты. если знать в каком из байтов этот бит то можно просто использовать хоть сдвиг, но лучше AND для зануления.
I'm learning to live...

Последний раз редактировалось Stilet; 22.11.2013 в 21:53.
Stilet вне форума Ответить с цитированием
Старый 22.11.2013, 21:48   #3
КРИЖ
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это не совсем правда. вещественный тип тоже представляет из себя байты и биты. если знать в каком из байтов этот бит то можно просто использовать AND для зануления.
ну да 1 бит для знака 8 битов под експоненту 23 бита под мантиссу. просто когда пытаюсь применить сдвиг влево или в право то копилятор ругается матом для типа double а на int нет
КРИЖ вне форума Ответить с цитированием
Старый 22.11.2013, 21:54   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А это потому что ты пытаешся работать с ним как с вещественным, а надо работать как с массивом байтов. Короче приведение типов нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.11.2013, 21:57   #5
КРИЖ
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 44
По умолчанию

double приводим r int делаем сдвиг потом обратно к double и выводим на экран все правильно?

Код:
float k;
k=-1.7;
int i=*(int *)(&k);
cout<<k<<" "<<(float)((i<<1)>>1)<<endl;
знак убрал, и вместо 1,7 получил 1,07e+009 кажется это не одно и тоже число

подумал что может быть из-за сдвига там что-то могло утерятся решил сделать так но тоже самое получилось может кто поможет?)
Код:
unsigned int int_abs(int i)
{
	int const mask = i >>(sizeof(int)*CHAR_BIT-1);
	return (i+mask)^mask;
}
void main(void)
{
	float k;
	k=-1.7;
	int i=*(int *)(&k);
	cout<<k<<" "<<(float)(int_abs(i))<<endl;
	getchar();
}

Последний раз редактировалось Stilet; 22.11.2013 в 23:12.
КРИЖ вне форума Ответить с цитированием
Старый 23.11.2013, 08:45   #6
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <stdio.h>

double _abs(double n) {
   char* p = (char*)&n;
   if(p[7] & 0x80) {
        p[7] &= ~0x80;
        return *(double*)p;
   }
   return n;
}


int main(void) {
   printf("%lf\n", _abs(-1123.456f));
   printf("%lf\n", 1123.456f);
   return 0;
}
http://codepad.org/YIk2K9Ix
Nuklon вне форума Ответить с цитированием
Старый 23.11.2013, 17:51   #7
КРИЖ
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Nuklon Посмотреть сообщение
Код:
#include <stdio.h>

double _abs(double n) {
   char* p = (char*)&n;
   if(p[7] & 0x80) {
        p[7] &= ~0x80;
        return *(double*)p;
   }
   return n;
}


int main(void) {
   printf("%lf\n", _abs(-1123.456f));
   printf("%lf\n", 1123.456f);
   return 0;
}
http://codepad.org/YIk2K9Ix
спасибо но я уже написал правда по-другому не много
Код:
inline float float_abs(float i)
{
	_asm
	{
		xor eax,eax
		xor eax,i
		and eax,0x7FFFFFFF
		and i,eax
	}
	return i;
}
КРИЖ вне форума Ответить с цитированием
Старый 25.11.2013, 07:04   #8
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Код:
  if(p[7] & 0x80) {
        p[7] &= ~0x80;
Проверка условия не нужна.
nikmoon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить алгоритм, который по введённому N, (0<=N<=3 000 000 000) определяет, какое число стоит на N-ом месте в последовательност FIREMAX Помощь студентам 1 02.02.2013 12:50
Составить алгоритм, который по введённому N, (0<=N<=3 000 000 000) определяет, какое число стоит на N-ом месте в последовательност FIREMAX Помощь студентам 3 28.11.2012 22:52
Составить алгоритм, который по введённому N, (0<=N<=3 000 000 000) определяет, какое число стоит на N-ом месте в последовательност FIREMAX Паскаль, Turbo Pascal, PascalABC.NET 0 28.11.2012 20:54
Как правильно регистрировать сайт, который сделал для других? DeniSa Свободное общение 3 11.11.2011 22:33
Есть чат на яваскрипте.не могу поставит знак +;Хотя люди его как то ставят, просто мой знак + заменяется maksim1983 JavaScript, Ajax 4 23.02.2009 07:55