Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
#1

Как получить битики float - C++

02.02.2014, 19:32. Просмотров 679. Ответов 21
Метки нет (Все метки)

Здравствуйте!

Кто-нибудь знает как получить битики у float?

C++
1
2
3
4
5
6
7
8
9
10
11
12
 
vector<bool>code;
int i2 = 0;
float one = 1;
float x = 0.36 ;
for (int i = 0; i < 3; i++){
int res = (x & one)>>i2; // с float не работает
if (res) code.push_back(1);
code.push_back(0);
one << 1;
i2++;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
vector<bool>code;
int one = 1;
float x = 0.36 ;
int * ptr = (int*) (&x);
for (int i = 0; i < 3; i++){
int res = (*ptr & one)>>i2; // тоже не получается
if (res) code.push_back(1);
code.push_back(0);
one << 1;
i2++;
}
Уже что только не пробовал!

Как это можно реализовать? Подскажите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 19:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить битики float (C++):

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing - C++
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

Получить в вектора, float - C++
Здравствуйте. Есть: Vector vecAngle; Как получить float *flAngle с него?

Из числа float получить два int-a: целую и дробную части - C++
Всем привет. Как можно из числа float получить два inta. приведу пример: есть 1,45 и 2,397. из первого нужно получить 1 и 45, из второго 2...

Чем отличаются float преобразования (float)var от float(var) - C++
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

неверное приведение void* к *float а далее к float - C++
Почему когда привожу void* к int* потом к int то все работает, данные не бьются и работают нормально, когда делаю те же операции но с...

invalid types `float[float]' for array subscript - C++
void SEARCH(float vol, float price, int i) { if (i&gt;N) { if(price&gt;maxprice) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
02.02.2014, 19:39 #2
Klafe,
C++
1
2
3
4
#include <bitset>
....
float a = 3.;
cout << (bitset<32>) a;
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
02.02.2014, 22:56 #3
Я проверил: на дробную часть преобразование к bitset<32> не реагирует никак. Как будто, не флоат, а инт преобразуется.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
02.02.2014, 23:00 #4
Цитата Сообщение от edwvee Посмотреть сообщение
Я проверил: на дробную часть преобразование к bitset<32> не реагирует никак. Как будто, не флоат, а инт преобразуется.
а Вы знаете как хранятся переменные с плавающей запятой? они вообще так и хранятся, как int.

Добавлено через 33 секунды
или я неправильно понял?
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
02.02.2014, 23:04 #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
а Вы знаете как хранятся переменные с плавающей запятой? они вообще так и хранятся, как int.

Добавлено через 33 секунды
или я неправильно понял?
Не правильно.
Следующие два кода выдают один и тот же результат. Компилятор minGW.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <bitset>
 
using namespace std;
 
int main()
{
    float number;
    number = 9.24452f;
    cout << (bitset<32>) number;
    return 0;
}
и
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <bitset>
 
using namespace std;
 
int main()
{
    int number;
    number = 9;
    cout << (bitset<32>) number;
    return 0;
}
Притом для второго случая выдаваемый результат правилен.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
02.02.2014, 23:22 #6
edwvee, согласен, в той строке, которую я раньше написал, происходит неявное преобразование doubel к int. вот немного поправил. вроде бы работает
C++
1
2
double a = 9.8768;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Для флоата можно то же самое делать, только преобразовывать к int и 32 байта, вместо 64
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
02.02.2014, 23:42 #7
Цитата Сообщение от metaluga145 Посмотреть сообщение
edwvee, согласен, в той строке, которую я раньше написал, происходит неявное преобразование doubel к int
Как удалось это выяснить? Интересно.
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
03.02.2014, 00:34  [ТС] #8
Цитата Сообщение от metaluga145 Посмотреть сообщение
Для флоата можно то же самое делать, только преобразовывать к int и 32 байта, вместо 64
Не получается. И так не получается:

C++
1
2
double a = 0.36;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Вот так у меня не работает. Пишет, что с b проблема.

C++
1
2
3
double a = 0.36;
long b;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Вот так выдает не правильный (со всеми дробями одинаковый) результат.

C++
1
2
3
[
double b = 0.36;
cout << (bitset<64>) (reinterpret_cast<long>(&b)) << endl;
Вот так тоже выдает не правильный (со всеми дробями одинаковый) результат.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
03.02.2014, 01:35 #9
Klafe, хм... Вы хоть бы почитали о том, что я Вам пишу, а в частности про reinterpret_cast.
вот так должно быть правильно
C++
1
2
3
double a = 0.36;
long b;
cout << (bitset<64>) *(reinterpret_cast<long*>(&b)) << endl;
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
03.02.2014, 02:54 #10
Своял на коленке:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
 
void showBytes( const void *src, int byteCnt ) {
   if ( byteCnt > 1 )
      showBytes( static_cast< const unsigned char * >( src ) + 1, byteCnt - 1 );
   
   for ( unsigned int i = 0; i < 8; i++ )
      std::cout << (( *static_cast< const unsigned char * >( src ) & ( 128 >> i )) ? '1' : '0' );
   
   std::cout << ' ';
}
 
int main() {
   float a = 9.4;
   double b = 123.3;
   unsigned int c = 1023;
   
   std::string str;
   
   showBytes( &a, sizeof( a ));
   std::cout << std::endl;
   
   showBytes( &b, sizeof( b ));
   std::cout << std::endl;
   
   showBytes( &c, sizeof( c ));
   std::cout << std::endl;
   
   return 0;
}
Ну или с bitset если так хочется его использовать;

C++
1
2
3
4
5
6
7
8
#include <bitset>
 
void showBytes( const void *src, int byteCnt ) {
   if ( byteCnt > 1 )
      showBytes( static_cast< const unsigned char * >( src ) + 1, byteCnt - 1 );
   
   std::cout << std::bitset< 8 >( *static_cast< const unsigned char * >( src )) << ' ';
}
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.02.2014, 03:09 #11
C++
1
2
3
4
union FloatBit{
    float x;
    char* c;
}
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
03.02.2014, 03:17 #12
union не для этого предназначен.
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
03.02.2014, 03:19 #13
И что мешает предназначить?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
03.02.2014, 03:32 #14
UB мешает как бы.
Klafe
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 101
03.02.2014, 03:37  [ТС] #15
Всем большое спасибо за помощь!!!

Родил!!!

Просто делаю лабу, необходимо код Шеннона реализовать! Вот была загвоздка (а я C++ так хорошо не знаю).

Бел пол-литра не разберешься!!!

Скажите, а почему нельзя к double или к float применять побитовые операторы (or, and, << и т. д.). Ведь они же в памяти все хранятся ка 0 и 1???

Т. е. какая разница, мы же сдвигаем 0 или 1, а не float или int??

Не понимаю...

PS: а с union я пробовал как здесь написано, у меня не получилось.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 03:37
Привет! Вот еще темы с ответами:

cannot convert `float' to `float*. Почему так происходит? - C++
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра надо сдать уже #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

Ошибка cannot convert 'float' to 'float*' - C++
Здравствуйте, что означает error: cannot convert 'float' to 'float*' for argument '1' to 'int mas_time(float*, int)'? Из-за чего она...

ОШИБКА [Error] cannot convert 'int*' to 'float*' for argument '1' to 'void Syma(float*,int*,int) - C++
Какая то проблема с указателями,незнаю,не хочет щитать суму парних чисел в второй подпрограме.Извиниет за ошибки.Не владею руским.Помогите...

Как перевести из Float в String? - C++
Вот такой код: MemoryManager* MM = new MemoryManager(&quot;gta_sa.exe&quot;); DWORD offsets = { 0x14, 0x30 }; float ammo = 10; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.02.2014, 03:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru