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

Представление числа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.65
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
13.09.2010, 22:13     Представление числа #1
Доброго времени суток! Возникла такая проблема-задача, помогите, пожалуйста с решением.
Необходимо представить десятичное число в двоичном виде из 128-разрядной сетки, точнее 1 число в 64-разрядной, а квадрат этого числа, соответственно, в 128-разрядной. Из этого десятичного числа необходимо выбрать середину путем побитового сдвигания его двоичного представления с последующим наложением маски.После этого должна получиться как раз середина исходного десятичного числа. Побитовый сдвиг и маска более менее ясно как делать, а вот как представить найти не могу.
Используемая среда-Visual studio 2008 (C++)..хотя можно реализацию и на борланде.
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
13.09.2010, 22:15     Представление числа #2
Цитата Сообщение от Faltek Посмотреть сообщение
Из этого десятичного числа необходимо выбрать середину
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
13.09.2010, 23:42  [ТС]     Представление числа #3
Например если число 128 бит , то нужно средние 64. Число 3459999345 нужно 9999.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
13.09.2010, 23:49     Представление числа #4
Тебе нужно только вывести в двоичном виде ?
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 16:55  [ТС]     Представление числа #5
Нет, мне в двоичном виде нужно выделить середину из десятичного числа. Далее по циклу: дается десятичное число, переводится в 128-битное двоичное, сдвигается на 32 бита, накладывается маска, получается новое число, являющееся серединой исходного десятичного...далее опять то же самое. Десятичное---двоичное в 128 бит---сдвиг--маска--середина десятичного.

Добавлено через 16 часов 58 минут
Ну...подскажите хотя б как просто представить десятичное число в двоичном виде со 128-разрядной сеткой..
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
14.09.2010, 17:02     Представление числа #6
Скажите, что вам дано, и что вы хотите получить, не упоминая то КАК вы собираетесь это сделать.
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 18:19  [ТС]     Представление числа #7
Суть задачи в том, чтобы оперировать с десятичными числами представленными в двоичном виде. Исходная задача состоит в том, чтобы, имея десятичное число выделить его середину. Это десятичное число должно быть представлено в двоичной форме в 128-разрядной сетке, чтобы сдвинуть его на 32 разряда(бита) и преобразовать обратно в десятичное. В этом и заключается вся проблема, что не знаю как представить 10-е число в 2-й форме в 128-разрядной сетке.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.09.2010, 18:58     Представление числа #8
Цитата Сообщение от Faltek Посмотреть сообщение
что не знаю как представить 10-е число в 2-й форме в 128-разрядной сетке.
Число оно и в африке число, компьютеру абсолютно все равно в какой оно форме представлено. 128-разрядных чисел в С/Си++ нет. Пишите свой адаптер на основе массива.
Цитата Сообщение от Faltek Посмотреть сообщение
Например если число 128 бит , то нужно средние 64. Число 3459999345 нужно 9999.
Где в этих числах вы нашли 128 или 64 бита я не представляю.
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 19:05  [ТС]     Представление числа #9
9999 это всего лишь пример, число может быть любым целым. А можно ли создать свой пользовательский тип, имеющий размерность 128 бит?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.09.2010, 19:17     Представление числа #10
Цитата Сообщение от Faltek Посмотреть сообщение
9999 это всего лишь пример, число может быть любым целым. А можно ли создать свой пользовательский тип, имеющий размерность 128 бит?
Можно, в качестве средства хранения использовать массив из 16 char'ов.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.09.2010, 19:19     Представление числа #11
C
1
2
typedef unsigned int word32;    // 32 бита
typedef word32 word128[4];      // 4 слова по 32 бита
Давайте по порядку, что именно Вам надо? Битовый сдвиг такого массива и наложение маски на такой массив?
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 19:42  [ТС]     Представление числа #12
А как тогда в этом случае, получить из этого массива десятичное число?
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
14.09.2010, 19:51     Представление числа #13
Размер инта зависит от компилятора, насколько я знаю.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.09.2010, 19:57     Представление числа #14
Цитата Сообщение от Faltek Посмотреть сообщение
А как тогда в этом случае, получить из этого массива десятичное число?
Я же говорю компилятору побоку в каком виде число. Чтобы работать с 128-битным числом мы создаем массив 32-х битных чисел. Чтобы посмотреть на это число, мы можем либо преобразовать его в строку, либо просто вывести на экран. В общем как я понял вам надо что-то подобное:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <string.h>
#include <stdio.h>
 
typedef unsigned int word32;    // 32 бита
typedef word32 word128[4];      // 4 слова по 32 бита
 
#define BITSONWORD32    32
#define BITSONWORD128   128
 
#define SIZEWORD128     4
 
void shift_right(word128 n, int s) {
    int i;
    word32 t = 0;
    word32 c = 0;
    
    // в этом месте осуществляется сдвиг по одному слову
    // то есть по 32 бита
    if(s/BITSONWORD32) {
        for(i = SIZEWORD128 - 1; i >= s/BITSONWORD32; --i)
            n[i] = n[i - s/BITSONWORD32];
        
        for(i = 0; i < s/BITSONWORD32; ++i)
            n[i] = 0;
    }
    
    // здесь производится сдвиг оставшейся части битов
    if((s %= BITSONWORD32)) {
        for(i = 0; i < SIZEWORD128; ++i) {
            t = n[i];
            n[i] = (t >> s) | c;
            c = (t << (BITSONWORD32 - s));
        }
    }
}
 
// битовый AND с сохранением результата в 'a'
void and(word128 a, word128 b) {
    int i;
    for(i = 0; i < SIZEWORD128; ++i)
        a[i] &= b[i];
}
 
int main()
{
    int i;
    word128 x = { 0xAAAAAAAA, 0x12345678, 0x12345678, 0 }; // исходное число
    word128 y = { 0, 0, 0xFFFFFFFF, 0xFFFFFFFF };          // маска
    
    shift_right(x, 32); // сдвиг числа на 32 бита вправо
    and(x, y);          // наложение маски
    
    // вывод результата
    // в итоге в числе x - лежат средние 64 бита
    // то есть число 0x1234567812345678 (а старшие 64 бита все нулевые)
    for(i = 0; i < 4; ++i)
        printf("%0.8x ", x[i]);
    printf("\n"); 
}
Это не полностью рабочий код (написал только что и от балды ничего не проверяя) и возможно совсем не то, что вам надо.
Если оно, то реализовывайте по аналогии битовый сдвиг влево и все недостающие битовые операции. Только сделайте их полностью рабочими. Почему-то мне кажется, что если в такую функцию сдвига послать значение больше 128, то она рухнет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2010, 20:41     Представление числа
Еще ссылки по теме:

Десятичное представление заданного числа C++
C++ Внутреннее представление числа в памяти
Представление числа в 16-ричном виде C++

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

Или воспользуйтесь поиском по форуму:
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 20:41  [ТС]     Представление числа #15
Спасибо за совет, попробую реализовать!
Yandex
Объявления
14.09.2010, 20:41     Представление числа
Ответ Создать тему
Опции темы

Текущее время: 14:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru