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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2015, 13:38   #1
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию Си. Побитовый сдвиг

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

Хочу воспользоваться оператором побитового сдвига (>>) применительно к переменной типа float

Ничего не выходит

Код:
float val;

val=(val>>16) | (val<<16);
Подскажите, пожалуйста, как провернуть это не напрямую с флоатом, а с областью памяти, которую занимает флоат? Как выделить два байта из флоата?
Bayern_M вне форума Ответить с цитированием
Старый 19.05.2015, 13:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что именно ты хочешь получить побитовым сдвигом?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.05.2015, 13:46   #3
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А что именно ты хочешь получить побитовым сдвигом?
Байты переставить. Т.е. вместо 0x3faa54af, получить, например, 0x54af3faa

Чтобы записать в две ячейки типа short int.

С ансайт лонгом все работает без проблем.
Bayern_M вне форума Ответить с цитированием
Старый 19.05.2015, 14:48   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну а ты в курсе вообще как устроен вещественный тип?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.05.2015, 14:59   #5
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну а ты в курсе вообще как устроен вещественный тип?
Да, первый бит знак, потом 8 бит порядка и 23 бита для мантиссы

Мне нужно просто переставить первые два байта с последними у флоата. И записать полученное число по адресу начала двух short int (short int у меня массив).

Мне подсказал руководитель, что операторы сдвига не работают с флоатом, но работают с областью памяти, которую занимает флоат. Вот я никак не соображу, как мне работать с этой областью памяти и операторами сдвига

Последний раз редактировалось Stilet; 19.05.2015 в 15:35.
Bayern_M вне форума Ответить с цитированием
Старый 19.05.2015, 15:39   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну это уже работа с памятью. memcpy() используй. Копируй в массив 4 байтный или сколько там у флоата. Потом байты в том же массиве меняй и тем же memcpy() возвращай назад. Что-то типа
Код:
float f=34234;
int n[sizeof(f)]={0};
memcpy(&n,&f,sizeof(f));
работаем c массивом n
memcpy(&f,&n,sizeof(f));
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.05.2015, 16:10   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    //1 способ
    union {
        float a;
        short int b[2];
    } c;
    scanf("%f", &c.a);
    printf("%f %hd %hd\n", c.a, c.b[0], c.b[1]);
    short int tmp = c.b[0];
    c.b[0] = c.b[1];
    c.b[1] = tmp;
    printf("%f %hd %hd\n", c.a, c.b[0], c.b[1]);
    //2 способ
    float f = c.a;
    short int *p = (short int *) &f;
    printf("%f %hd %hd\n", f, p[0], p[1]);
    tmp = p[0];
    p[0] = p[1];
    p[1] = tmp;
    printf("%f %hd %hd\n", f, p[0], p[1]);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Побитовый сдвиг вправо (C) Skeich Помощь студентам 0 04.12.2013 11:40
c++ побитовый сдвиг ошибка NinjaNoob Помощь студентам 2 12.10.2012 23:06
амперсанд и побитовый сдвиг Kukurudza Общие вопросы C/C++ 7 27.07.2011 01:08
Побитовый сдвиг Belii09878 Помощь студентам 10 02.02.2010 14:46
C++ побитовый сдвиг KOLYTFR Помощь студентам 1 03.06.2009 22:42