Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.59/70: Рейтинг темы: голосов - 70, средняя оценка - 4.59
illgocrazy
1

Получить бит числа

11.12.2010, 19:24. Просмотров 12723. Ответов 3
Метки нет (Все метки)

Необходимо получить значение бита числа double. Такой код:
C++
1
2
3
4
5
6
7
8
9
bool getBit(double * d, int bit){
 
        unsigned mask=1<<bit;
        bool res;
        if (bit >32) 
            res=(*((unsigned *)d+1))&mask;
        else res=(*(unsigned *)d)&mask;
        return res;
    }
работает очень медленно. Наверно, есть другие способы. Подскажите, пожалуйста.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2010, 19:24
Ответы с готовыми решениями:

Задано количество бит.как из него получить число
По условиям лабораторной работы нужно вводить число бит (например 512) и генерировать на основе...

Нахождение бит мантиссы и бит порядка вещественного числа
В вузе задали написать программу, которая определяет в каких байтах расположена мантисса, а в каких...

из 32 бит числа х2 16 бит
Привет всем. Как разделить 32 битое число с плавающей запятой на 2 целых числа 16 бит?

Как получить младший байт и его старший бит
Подскажите как получить младший байт и его старший бит. И как сделать замену старшего бита младшего...

3
Эксперт С++
5019 / 2598 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.12.2010, 20:13 2
Бит из double. Редкое извращение. Надо заметить, что Вы получаете бит не из double, а целочисленного числа, к которому было приведено число типа double.

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
#define GETBIT(x,pos)   ( ((x) & ( 0x1 << (pos) )) !=0 )
 
int main()
{
        double a = 7.8;
        printf("%d\n", GETBIT((unsigned int)a, 2));
        return 0;
}
1
illgocrazy
11.12.2010, 22:06 3
Работает действительно быстрее. Но неправильно. Выводит как раз биты приведенного к целому числа.
А я привожу не само double к unsigned, а указатель на double к указателю на unsigned, поэтому получаю нужные числа.
C++
1
2
double a=7.8;
printf("%d\n", getBit(&a, 2));
Результат: 0.

Добавлено через 56 минут
Всё получилось и работает в 7 и более раз быстрее На всякий случай правильное решение:

C++
1
#define GETBIT(x,pos)   ( ((x) & ( 0x1 << (pos) )) !=0 )
C++
1
2
3
4
5
double a=7.8;
for (int i=31; i>=0;i--)
printf("%d", GETBIT(*(((unsigned int*)&a)+1), i));
for (int i=63; i>31;i--)
printf("%d", GETBIT(*(unsigned int*)&a, i));
Получаю результат, как здесь http://www.binaryconvert.com/r... =055046056
3053 / 1458 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
11.12.2010, 22:41 4
C++
1
2
3
4
5
6
        double n = 2.00001;
        unsigned long int* c = static_cast<unsigned long int*>(static_cast<void*>(&n));
        for (int i=sizeof(double)*8-1; i>=0; i--)
                std::cout << ((*c >> i)&1);
 
        std::cout << std::endl;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2010, 22:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Получить минимальный множитель до выхода из разрядной сетки 16 бит переменной
Суть задачи: Дано число 6000 в 16 разрядной(16 бит) переменной, надо найти минимальный...

Дано целое двухзначное число a. Получить удвоенное значение наименьшего числа, которое можно получить из цифр заданного числа a
Дано целое двухзначное число a. Получить удвоенное значение наименьшего числа, которое можно...

Первый бит числа
Пишу программу для сжатия файлов по алгоритму RLE. Чтобы программа понимала, что читаемое число...

Как определить i-й бит числа
Доброго врумени суток, не могу ни как сообразить, как определить i-й бит числа. На просторах...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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