С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.65
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
#1

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

13.09.2010, 22:13. Просмотров 3670. Ответов 14
Метки нет (Все метки)

Доброго времени суток! Возникла такая проблема-задача, помогите, пожалуйста с решением.
Необходимо представить десятичное число в двоичном виде из 128-разрядной сетки, точнее 1 число в 64-разрядной, а квадрат этого числа, соответственно, в 128-разрядной. Из этого десятичного числа необходимо выбрать середину путем побитового сдвигания его двоичного представления с последующим наложением маски.После этого должна получиться как раз середина исходного десятичного числа. Побитовый сдвиг и маска более менее ясно как делать, а вот как представить найти не могу.
Используемая среда-Visual studio 2008 (C++)..хотя можно реализацию и на борланде.
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2010, 22:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Представление числа (C++):

Побитовое представление числа - C++
Добрый вечер, подскажите, пожалуйста, каким образом можно сформировать число из нужных мне битов, скажем, есть 4 бита (0, 0, 0, 1), далее...

Двоичное представление числа - C++
Введите целое положительное N и выведите его двоичное представление. Ниже представлен код, но он выводит число на оборот (то есть если...

Побитовое представление числа. - C++
Всем привет, подскажите пожалуйста, нужно: Написать программу, которая принимает с клавиатуры число x, имеющее тип unsigned char и...

Десятичное представление заданного числа - C++
Помогите написать код:

представление числа в виде суммы 3 и 5 - C++
Известно что любое целое положительное число, которое больше 7, можно представить суммой троек и пятерок (37=4*3 + 5*5). Произвольную...

Внутреннее представление числа в памяти - C++
нужно сделать реализацию числа в памятиfloat d1 = 72.9e-8;... а как??? это нужно число перевести в двоичную систему, или как???

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

Добавлено через 16 часов 58 минут
Ну...подскажите хотя б как просто представить десятичное число в двоичном виде со 128-разрядной сеткой..
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
14.09.2010, 17:02 #6
Скажите, что вам дано, и что вы хотите получить, не упоминая то КАК вы собираетесь это сделать.
0
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 18:19  [ТС] #7
Суть задачи в том, чтобы оперировать с десятичными числами представленными в двоичном виде. Исходная задача состоит в том, чтобы, имея десятичное число выделить его середину. Это десятичное число должно быть представлено в двоичной форме в 128-разрядной сетке, чтобы сдвинуть его на 32 разряда(бита) и преобразовать обратно в десятичное. В этом и заключается вся проблема, что не знаю как представить 10-е число в 2-й форме в 128-разрядной сетке.
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.09.2010, 18:58 #8
Цитата Сообщение от Faltek Посмотреть сообщение
что не знаю как представить 10-е число в 2-й форме в 128-разрядной сетке.
Число оно и в африке число, компьютеру абсолютно все равно в какой оно форме представлено. 128-разрядных чисел в С/Си++ нет. Пишите свой адаптер на основе массива.
Цитата Сообщение от Faltek Посмотреть сообщение
Например если число 128 бит , то нужно средние 64. Число 3459999345 нужно 9999.
Где в этих числах вы нашли 128 или 64 бита я не представляю.
0
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 19:05  [ТС] #9
9999 это всего лишь пример, число может быть любым целым. А можно ли создать свой пользовательский тип, имеющий размерность 128 бит?
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.09.2010, 19:17 #10
Цитата Сообщение от Faltek Посмотреть сообщение
9999 это всего лишь пример, число может быть любым целым. А можно ли создать свой пользовательский тип, имеющий размерность 128 бит?
Можно, в качестве средства хранения использовать массив из 16 char'ов.
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.09.2010, 19:19 #11
C
1
2
typedef unsigned int word32;    // 32 бита
typedef word32 word128[4];      // 4 слова по 32 бита
Давайте по порядку, что именно Вам надо? Битовый сдвиг такого массива и наложение маски на такой массив?
0
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 19:42  [ТС] #12
А как тогда в этом случае, получить из этого массива десятичное число?
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
14.09.2010, 19:51 #13
Размер инта зависит от компилятора, насколько я знаю.
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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, то она рухнет
0
Faltek
0 / 0 / 0
Регистрация: 18.08.2009
Сообщений: 9
14.09.2010, 20:41  [ТС] #15
Спасибо за совет, попробую реализовать!
0
14.09.2010, 20:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2010, 20:41
Привет! Вот еще темы с ответами:

Получить q ичное представление числа - C++
Даны натуральные числа p и q(q&gt;=2).Получить q-ичное представление числа p в виде такой последовательности a...a целых неотрицательных чисел...

Представление числа в k-ой системе счисления - C++
Помогите, пожалуйста, надо написать полноценную программу перевода числа в систему счисления по основанию k. На входе программы — число для...

Представление числа в 16-ричном виде - C++
Как это звучит на русском? e=C%16; d=C/16; HEX_A=array_m+HEX_A; C=d;

Представление числа в разном формате - C++
как можно представить числа, например 2, в формате 2.0 или 2.00, нужна для предсталения числа в виде таблицы


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

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

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