Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс - шестнадцатеричное число 
:(
    Опции темы
Ripper
Дата 1.11.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



16ричное число определяется его длиной (количество цифр в числе) и массивом значений 16ричных цифр(типа char). Число со знаком хранится в прямом коде. При выполнении арифметических операций использовать дополнительный код. Память под массив выделяется статически, во время компиляции и задается массивом фиксированного размера
Нужно сделать 3 конструктора, пустой, с hex константой и строкой символов.

Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как. Вообще странно, написано что есть массив значений ШЕСТНАДЦАТЕРИЧНЫХ цифр (char массив), но прямой код подразумевает единицы и нули? 
Как вообще учитывается знак в таком случае? Т.е. hex(0xABCFD) - чему это число равно в прямом коде? Вот -5, 10, 15 я знаю чему равно, а тут же беззнаковая константа или как? Мне говорили что можно считать что знак задан в самом числе, т.е. ABCDF перевести в двоичное и первая цифра знак - но я чето совсем не понимаю о чем речь, ведь тогда число теряется...

Вообщем можете привести пример, например создать 2 класса и сложить их (ну там перегрузить + - надо будет ещё). Меня именно эти коды угнетают  smile 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Lazin
Дата 1.11.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Ripper @  1.11.2007,  16:05 Найти цитируемый пост)
Как вообще учитывается знак в таком случае? Т.е. hex(0xABCFD) - чему это число равно в прямом коде? Вот -5, 10, 15 я знаю чему равно, а тут же беззнаковая константа или как? Мне говорили что можно считать что знак задан в самом числе, т.е. ABCDF перевести в двоичное и первая цифра знак - но я чето совсем не понимаю о чем речь, ведь тогда число теряется...

Если старший бит равен 1 то число отрицательное, т.е. если старший разряд больше 7 - число отрицательное.
PM MAIL Skype GTalk   Вверх
GIK
Дата 1.11.2007, 16:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Цитата

Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как. Вообще странно, написано что есть массив значений ШЕСТНАДЦАТЕРИЧНЫХ цифр (char массив), но прямой код подразумевает единицы и нули? 
Как вообще учитывается знак в таком случае? Т.е. hex(0xABCFD) - чему это число равно в прямом коде?


Думаю, что можно за счет длины шестнадцатиричного значения, можно легко вычислить цифровое значение, простым деление, а потом его в двоичное переконвертить, хотя наверника лекго можно и сразу, но толкьо как???  smile 



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
zkv
Дата 1.11.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Ripper @  1.11.2007,  16:05 Найти цитируемый пост)
прямой код подразумевает единицы и нули?

нет он говорит о том, что из себя представляет набор бит. те неважно в каком виде мы его представим на бумаге, набор битов все равно тот же останется.
важно, что эти биты значат вот представление числа и дает нам эту информацию
Цитата(Ripper @  1.11.2007,  16:05 Найти цитируемый пост)
Т.е. hex(0xABCFD) - чему это число равно в прямом коде?

шестнадцатиричный или двоичный не суть. см. выше.
зависит от способа хранения числа. 

дополнительный код
погугли, подтяни теорию.
вот ссылка неплохая на первый взгляд

Добавлено @ 16:42
Цитата(GIK @  1.11.2007,  16:29 Найти цитируемый пост)
Думаю, что можно за счет длины шестнадцатиричного значения, можно легко вычислить цифровое значение, простым деление, а потом его в двоичное переконвертить, хотя наверника лекго можно и сразу, но толкьо как???

шестнадцатиричное в двоичное переводится простой заменой 1 hex цифры 4 bin цифрами:
Код

static const char *HexDigitToBinNumber( char dig )
{
    switch( dig )
    {
    case '0': return "0000";
    case '1': return "0001";
    case '2': return "0010";
    case '3': return "0011";
    case '4': return "0100";
    case '5': return "0101";
    case '6': return "0110";
    case '7': return "0111";
    case '8': return "1000";
    case '9': return "1001";
    case 'A': return "1010";
    case 'B': return "1011";
    case 'C': return "1100";
    case 'D': return "1101";
    case 'E': return "1110";
    case 'F': return "1111";
    }
    return "";
}
 

Это сообщение отредактировал(а) zkv - 1.11.2007, 16:45
PM MAIL   Вверх
Ripper
Дата 1.11.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Все равно не пойму. Если я переведу 16ричное число в двоичное я получу прямой код? 
Цитата

Прямой код. Прямой код двоичного числа совпадает по изображению с записью самого числа. Значение знакового разряда для положительных чисел равно 0, а для отрицательных чисел 1.


Прямой код FFF не равен FFF же. Т.е. нужно перевести в двоичное. И я уже получу вместе со знаковым разрядом ?
Странно, почему тогда мы не говорим что числа 864 отрицательное или какое там, судя по первому разряду?  А только для шестнадцатеричных? 

F = 1111, получается 1.111 но это уже другое число, когда мы 1 бит под знак берем число же меняется
Цитата

Пример. В случае, когда для записи кода выделен один байт, для числа +1101 прямой код 0,0001101, для числа -1101 прямой код 1,0001101.

А если число без знака задано, как я его в прямой код запишу. Там конструктор с 16ричной константой... 

Щас прочту полностью ссылки, но просто мы когда то это проходили сквозь пальцы, и везде помню указывался знак. Для меня эти коды муть. Особенно что число FFF отрицательное, а 111 положительное. А как сделать положительное число записанное в десятичной системе как 255 - шестнадцатеричным если fff отрицательное.. ерунда ) 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
zkv
Дата 1.11.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Ripper, ты не понял smile
Цитата(Ripper @  1.11.2007,  18:05 Найти цитируемый пост)
Если я переведу 16ричное число в двоичное я получу прямой код? 

НЕ ВАЖНО в какой системе число, значение его не меняется.
Какая разница как ты запишешь: 12(dec) или С(hex) или 1100(bin). К примеру ты пересчитаешь баранов в двоичной системе счисления, а потом в десятичной, их количество от этого не изменится, верно?  smile 
Просто когда описывают хранение чисел в ячейках памяти, удобнее объяснять в двоичной системе. Шестнадцатиричная удобна тем, что запись числа краткая и число можно не напрягаясь в уме конвертнуть в двоичную систему. С десятичной понятно.
Уяснили, в какой бы системе число не представили суть его не меняется.

Цитата(Ripper @  1.11.2007,  18:05 Найти цитируемый пост)
Прямой код FFF не равен FFF же.

это неверное утверждение в общем случае. 
FFF(hex) == 1111 1111 1111(bin), все будет зависеть от разрядной сетки (ее размера)
допустим числа у нас хранятся в доп. коде.
1. допустим у нас число представлено 16 битами,  получается, что для хранения значения числа мы используем 14 бит, а 2 для знака и контроля переполнения. в этом случае FFF означает:
0000 1111 1111 1111 - впереди 2 нуля -> доп. код равен прямому коду - в прямом коде, и равен 2^12 - 1 в десятичной системе.
2. допустим у нас число представлено 12 битами,  получается, что для хранения значения числа мы используем 10 бит, а 2 для знака и контроля переполнения. в этом случае FFF означает:
1111 1111 1111 - впереди 2 единицы - это отрицательное число, можешь самостоятельно перевести его в обратный и прямой коды (алгоритмы имеются), можешь найти его десятичное представление (мне что-то не хочется считать  smile), помним, суть числа от перевода не изменится, сколько баранов оно обозначало, столько и будет обозначать дальше.
3. допустим у нас число представлено 13 битами,  получается, что для хранения значения числа мы используем 11 бит, а 2 для знака и контроля переполнения. в этом случае FFF означает:
0 1111 1111 1111 - впереди 0, затем 1, не помню что именно это обозначает, но какую-то бяку вроде переполнения в результате некоторых операций, те это число - инвалид, и вообще не может быть никуда переведено (вернее его сначала нужно привести к нормальному виду, какими-то хитрыми способами)

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

Еще заметь, что если бы мы рассматривали хранения беззнаковых целых, то все биты были бы использованы для хранения значения числа, и число FFF даже в 12 битной сетке означало бы 2^12 - 1.

Надеюсь что-то прояснил.
PM MAIL   Вверх
Ripper
Дата 1.11.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Все равно туго. Я понимаю что одно число в разных системах означает одно и тоже
Не говоря уже как это все в классе описать.
Допустим у нас класс - десятичное число. Мне нужно создать два объекта, в которых будут хранится десятичные числа. 
Я хочу первому присвоить -5. второму 3. и сложить их
Что такое -5? не бывает же -FFF. Значит и 10 числа должны представлятся и рассматриватся с помощью разядной сетки
Или допустим
1111 1010 0011 1101. Что это за число? 11 отрицательное вроде. А САМО значение это что? Все 16 цифр? Если 14 - то оно же портится. 
Я все равно не понимаю смысла. Когда мы решали примерчики н эти коды у нас было что то вроде
3+5 = ? Мы оба представляли в прямом коде, потом в дополнительном потом складывали и потом обратно в прямой и находили ответ .Вроде так. Но тут знак известен. А что значит конструктор, с 16ой константой, я туда же знак не передам вообще. 
вот нужно выполнить действия -452+23 в десятичной. Но я незнаю какой знак когда передаю конструктору. Как компьютер определяет этот знак на основе первых разрядов, это же не верно? Отбрасывается 1-2 разряда (в разных кодах) и само число имеет другой вид. 

Что значит с 8 до F числа отрицательные? т.е. F1 = 1111 0001 = 11. 110001 = число с отрицательным знаком и модулем 110001 = чему то другому? 

Еслиб задавался знак, было бы как то понятней чтоли... Хотя как это выглядит в си вообще ужс smile



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
bsa
Дата 2.11.2007, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



все очень просто. в 16-тиричной системе счисления нет понятия "отрицательное число". Просто потому, что это лишь цифро-буквенная трансляция тетрады бит. Но, искуственно было введено (на основании математики, конечно), что число, у которого старший бит включен является отрицательным. Но надо иметь в виду, что -10 - это 0xF6 (для байта), а не 0x8A. Почему? А потому что: 0x0A + 0xF6 = 0x100. Но, так как у нас исходных только два разряда, то отбросив 1 получаем 0x00. Что и требовалось доказать.
Но тут сразу может возникнуть вопрос, а как можно представить -255 в 16-тиричной системе, ведь 255=0xFF уже имеет установленный старший бит. Проблема в том, что с начала жизни мы привыкли к тому, что количество разрядов чисел у нас не ограничено. А в компьютерной технике все по-другому. Поэтому программисты постоянно должны понимать, достаточно ли размера переменной, для хранения необходимого диапазона чисел. Исходя из этого, для хранения -255 нужно выбрать минимум 3 разряда, но обычно их степень двойки...
PM   Вверх
Ripper
Дата 2.11.2007, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



bsa, Как тогда определить чему равно -10? Я написал 1000 1010 но это не верно... 
и как мне получить прямой код в си? Т.е. перевести из 16 в 2 ?  



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
bsa
Дата 2.11.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Ripper @ 2.11.2007,  08:04)
bsa, Как тогда определить чему равно -10? Я написал 1000 1010 но это не верно... 
и как мне получить прямой код в си? Т.е. перевести из 16 в 2 ?

-10 == 0 - 10 == 0х00 - 0х0A = 0x100 - 0x0A == 0xF6
или
-10 == -00001010 == 11110110 (инверсия всех битов и прибавление единицы) == 0xF6

понимаешь в чем дело, изначально все в компе хранится в 2-м виде. А уже ПО позволяет тебе видеть в других системах счисления.
Если тебе нужно вывести на экран число в двоичном виде, то нет ничего проще - воспользуйся операторами побитного сдвига вправо (>>) и побитовой "И" (&):
Код
char[8] toBin(unsigned char v) {
      char result[8];
      char *p = result;
      for(unsigned char mask = 0x80; mask; mask >>= 1, ++p)
           *p = (v & mask) ? '1' : '0';
      return result;
}

А в 16-тиричную переводится тоже легко. Опять же надо воспользоваться сдвигом, операцией "И" и выборкой из таблицы:
Код
char[2] toHex(unsigned char v) {
     static const char hex[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
     char result[2];
     result[0] = hex[v >> 4];
     result[1] = hex[v & 0xF ];
     return result;
}
Хотя, для перевода в 16-тиричную и обратно можно использовать стандартные средства, например printf/scanf и iostream (манипулятор std::hex).

PM   Вверх
Ripper
Дата 2.11.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



то что ты написал про -10 это помойму дополнительный код уже (инверсия и прибавление еденицы) а в прямом коде это 10001010 
Но вопрос в том, если я переведу число в двоичный код я получу прямой код? -10 = прямой код равен 10001010. А A5? Тут мы не пишем знак, значит он в самом числе? Тогда прямой код 10100101? 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
powerfox
Дата 2.11.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Ripper @  2.11.2007,  09:04 Найти цитируемый пост)
bsa, Как тогда определить чему равно -10? Я написал 1000 1010 но это не верно... 

Цитата(bsa @  2.11.2007,  11:22 Найти цитируемый пост)
-10 == -00001010 == 11110110 (инверсия всех битов и прибавление единицы) == 0xF6

Ещё раз, но по шагам.
Код

Сначала находим, как записывается число 10.
10 = 00001010 (использую 8 бит).
Теперь инвертируем.
11110101
+            1
11110110 -- это и есть -10!


Цитата(Ripper @  2.11.2007,  17:26 Найти цитируемый пост)
то что ты написал про -10 это помойму дополнительный код уже (инверсия и прибавление еденицы) а в прямом коде это 10001010 

Дополнительный код служит для представления отрицательных чисел. Единичка в старшем разряде лишь свидетельствует (признак) о том, что число отрицательное (но просто добавив её, нельзя получить то же число, но с другим знаком). Например, число 3: 0011. Как ты делаешь. то -3 будет 1011 - это неверно. Легко проверить.
Код

  0011
+1011
   1110   -- не 0!!!

Теперь правильное представление -3: ~0011+1 = 1101:
Код

    0011
  +1101
1 | 0000  -- 0! Всё верно.

Я не помню уже, что происходит с той единицей, что вылазит за пределы разрядной сетки. По идее. её контролировать не надо. А вот единичка в старшем разряде как-то используется (но я уже забыл как). Знаю, что есть команды, которые ипользуют признак того, что число отрицательное. Например, число итераций на языке ЭВМ, которую я проходил (упрощённый ассемблер) задавалось отрицательным числом, команда ISZ. кажется. После каждой итерации значение увеличивалось на 1. Проверялся именно старший бит (были так же описаны микрокоманды, составляющие данную команду).

Это сообщение отредактировал(а) powerfox - 2.11.2007, 18:20


--------------------
user posted image
PM WWW   Вверх
Ripper
Дата 2.11.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Прямой код я верно пишу. 
[-3]Прямой код =  0011. 
[-3]Обратный = 1101
Меня волнует то как это все дело на Си будет. Если я переведу число в двоичную систему я получу прямой код. потом мне его нужно инвертировать и добавить еденицу. Можно пример как это все делается, когда у меня два конструктора, один из них с hex константой другой со строкой. Вообще меня именно волновал вопрос получу ли я прямой код если переведу число ПРОСто в двоичный код. 
Вот -3 перевести на бумаге понимаю как, а A5 допустим? Если я переведу А5 в двоичный код я получу ПРЯМОЙ код?  (не дополнительный) 
мне нужно хранить всё в прямом коде. а дейсвтия выполнять в дополнительным. Покажите просто пример как из строки и/или константы поулчить прямой код, и сложить два числа в дополнительном например..  


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 2.11.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 2.11.2007,  18:38)
Покажите просто пример как из строки и/или константы поулчить прямой код, и сложить два числа в дополнительном например..

Получение прямого кода из двоичного-дополнительного (или любого другого):
Код

int convert_to_direct_code(int org)
{
 if (org>=0) return org;
 return (-org)|0x8000000;
}

И в другую сторону:
Код

int convert_from_direct_code(int direct)
{
 if (direct&0x80000000) return -(direct&0x7FFFFFFF);
 return direct;
}

Числа подразумеваются 32х битными.

Перевод в/из шестнадцатеричной строки вообще делается элементарно - старший бит прямого представления преобразуется в знак '-', остальные биты формируют число (всегда положительное).

Пример:
Код

int convert_to_direct_code(const char* org)
{
 bool do_negative=false;
 if (*org=='-') {do_negative=true; ++org;}
 int rv=strtoul(org,0,16);
 if (do_negative) rv|=0x80000000;
 return rv;
}

void convert_from_direct_code(int direct, char* out)
{
 if (direct&0x80000000) *out++='-';
 sprintf(out,"%X",direct&0x7FFFFFFF);
}


В твоем случае вместо целого 32х битного числа надо будет использовать многобайтное число, представленное в виде массива.

PM MAIL   Вверх
powerfox
Дата 2.11.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(xvr @  2.11.2007,  19:59 Найти цитируемый пост)
Получение прямого кода из двоичного-дополнительного (или любого другого):

int convert_to_direct_code(int org)

O_o
А зачем??? Это ведь просто "портит" число... Ведь простой оператор минус всё сделает сам...
Если уж и реализовывать в виде int, то использовать арифметические операторы.
Цитата(Ripper @  1.11.2007,  17:05 Найти цитируемый пост)
Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как.

Преобразовывать ничего не надо, как уже сказали: число, оно и в Африке число. Просто оно может быть записано по-разному (если уж не понятно, как объясняли выше, то пример - римские и арабские числа).
Как я понял, то просто надо получить массив char, который является представлением числа. Можеро реализовать посимвольный ввод, и писать в массив по числу (либо в двоичном, чтоб юзер вводил, либо в 16x). Если же хочется конструировать представление в виде массива из int, то, на мой взгляд, самое простое - использовать cout и записать в буфер число в нужном представлении. А затем уже прочитаь оттуда по цифре.


Это сообщение отредактировал(а) powerfox - 2.11.2007, 19:35


--------------------
user posted image
PM WWW   Вверх
xvr
Дата 2.11.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата

Цитата(xvr @  2.11.2007,  19:59 Найти цитируемый пост)
Получение прямого кода из двоичного-дополнительного (или любого другого):

int convert_to_direct_code(int org)

O_o
А зачем??? Это ведь просто "портит" число... Ведь простой оператор минус всё сделает сам...
Если уж и реализовывать в виде int, то использовать арифметические операторы.
Автору темы нужно было реализовать ПРЯМОЕ представление числа, а в компьютере используется ДОПОЛНИТЕЛЬНОЕ. Очевидно, что арифметику над этим ПРЯМЫМ представлением ему придется писать самому, 'простой оператор минус' расчитан на ДОПОЛНИТЕЛЬНОЕ. Но в его случае ему всеравно придется писать арифметику самому, так как у него будет арифметика с числами произвольной длинны (не 32 бита).
Цитата

Цитата(Ripper @  1.11.2007,  17:05 Найти цитируемый пост)
Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как.

Преобразовывать ничего не надо, как уже сказали: число, оно и в Африке число. Просто оно может быть записано по-разному (если уж не понятно, как объясняли выше, то пример - римские и арабские числа).
Ну надо человеку! Что поделать, задание такое smile
Кстати, в его случае имело бы смысл вообще хранить знак отдельно (не в старшем бите).
PM MAIL   Вверх
bsa
Дата 2.11.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Ripper
возможно, ты имеешь в виду, что у тебя нет ограничений на разрядность числа? Тогда действительно проще держать модуль числа и знак отдельным полем.
PM   Вверх
Ripper
Дата 2.11.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Хорошо, пользователь ввел строку (массив чаров) равную 8AB.  Что должно быть в классе в массиве том? 
Вот число которое в африке число... и неважно в какой оно системе - ну и чего
По мне так как я понял нужно 8АБ представить в двоичном, и записать в массив чаров - это будет прямой код, потом если первая цифра 1 то его инвертировать и прибавить еденицу. Получить дополнительный код. А потом сложение вычитание реализовать
Тока я пока не особо представляю как я это все сделаю, например 1)Разрядная сетка это sizeof(int)*8? 2)допустим два байта 16 бит а число AB в шестадцатеричной. значит 0000 0000 1010 1011 ? А какую тогда цифру вообще проверять, вот 00000000010101011 это записано будет в массиве, но как определить что есть первая. Или наверно нафиг ненужно нули писать. А если ввести AAAAAA то типа переполнение ?
Нет, все равно тупик)))  smile

Добавлено через 4 минуты и 51 секунду
1A - 0001 1010 - что здесь старший бит? [0]001 1010 
A1 - 1010 0001 а здесь [1]010 0001. Т.е. это отрицательное число с модулем 1010 0001 ?


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
bsa
Дата 2.11.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Ripper, ты сначала определись, что именно вводит пользователь. Если он может вводить -8AB и 8AB, то тебе нужно в дополнительный код переводить только число с минусом.
PM   Вверх
Ripper
Дата 2.11.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Да вроде не сказано в задании как вводить. сказано перегрузить >> <<. Но ведь тут говорят что нет такого понятия как отрицательное число для 8AB. оно отрицательно если первая цифра больше 7. 
Вводить как я понял нужно числа не указывая явно знак.
Тогда что должно быть в массиве в классе, если введены 1А и А1. что здесь будет модулем а что знаком? 



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
powerfox
Дата 2.11.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Автору темы нужно было реализовать ПРЯМОЕ представление числа, а в компьютере используется ДОПОЛНИТЕЛЬНОЕ

Что значит прямое?
Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Очевидно, что арифметику над этим ПРЯМЫМ представлением ему придется писать самому, 'простой оператор минус' расчитан на ДОПОЛНИТЕЛЬНОЕ. Но в его случае ему всеравно придется писать арифметику самому, так как у него будет арифметика с числами произвольной длинны (не 32 бита).

Вспомнилась сказка про белого бычка. Тут уже не раз прозвучало. Что есть 2 варианта работы с числом:
1. Хранить его в виде int. Все операции для такого числа есть. Лишь написать функции для представления его в формате, который требует условие (массив char). Вот и всё. Настраиваем, чтобы cout выводила числа в формате hex, выводим в буфер и читаем по цифре в массив. Задание выполнено.
2. Сами реализуем класс и соответствующие операции (в условии я нашёл только сложение), но нам также нужно преобразование в доп. код. Можно реализовать оператор побитового оператора и сложения с int (для приьавления единицы). Неограниченная длина - делаем вектор char и поле класса, которое хранит разрядность. Ничего такого, чтобы спорить.

Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Ну надо человеку! Что поделать, задание такое smile

Задание можно понять немного по разному, а реализовать - так вообще множество вариантов.

Добавлено через 3 минуты и 14 секунд
Что-то лень читать особо. Но что за навороты пошли с модулем и числом по отдельности? Всю жизнь число было "единым". Просто определённые разряды интерпретироваться могут по-разному. И зачем тут понятие модуля, если числа целые. Знаковый разряд и само число (модуль числа). Ввоидится вместе.

Ripper, ты получаешь всё число, но проверяешь старший разрад (чтобы узнать знак числа).


--------------------
user posted image
PM WWW   Вверх
powerfox
Дата 2.11.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(powerfox @  2.11.2007,  23:22 Найти цитируемый пост)
Что значит прямое?

Аа, понял. От вас просят упрощённо.

http://khpi-iip.mipk.kharkiv.edu/library/d...ra/chapter2.htm


--------------------
user posted image
PM WWW   Вверх
xvr
Дата 4.11.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 2.11.2007,  22:05)
Хорошо, пользователь ввел строку (массив чаров) равную 8AB.  Что должно быть в классе в массиве том? 
Вот число которое в африке число... и неважно в какой оно системе - ну и чего
По мне так как я понял нужно 8АБ представить в двоичном, и записать в массив чаров - это будет прямой код, потом если первая цифра 1 то его инвертировать и прибавить еденицу. Получить дополнительный код. А потом сложение вычитание реализовать
Тока я пока не особо представляю как я это все сделаю, например 1)Разрядная сетка это sizeof(int)*8? 2)допустим два байта 16 бит а число AB в шестадцатеричной. значит 0000 0000 1010 1011 ? А какую тогда цифру вообще проверять, вот 00000000010101011 это записано будет в массиве, но как определить что есть первая. Или наверно нафиг ненужно нули писать. А если ввести AAAAAA то типа переполнение ?
Нет, все равно тупик)))  smile

Добавлено @ 22:10
1A - 0001 1010 - что здесь старший бит? [0]001 1010 
A1 - 1010 0001 а здесь [1]010 0001. Т.е. это отрицательное число с модулем 1010 0001 ?

Почему то мне кажется, что от вас хотят получить представление с явным знаком, т.е. или '8AB' (положительное) или '-8AB' (отричательное) и не заниматься никакими интерпретациями никаких старших битов smile Так что в массиве должно лежать 8AB (в бинарном виде или в символьном или еще в каком - неважно), а знак должен лежать ВООБЩЕ отдельно, например так:

Код

char value[size];   // Body of number ('size' is template comstant)
bool sign; // Sign on number, false - positive, true - negative

PM MAIL   Вверх
MAKCim
Дата 4.11.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(xvr @  4.11.2007,  10:17 Найти цитируемый пост)
а знак должен лежать ВООБЩЕ отдельно, например так:

зачем хранить знак?
Ripper
по разрядности числа лимитированы или нет?
если лимитированы (допустим, 32 разряда)
хранить нужно int
а потом в зависимости от представления, которое нужно получить, преобразовывать этот int


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xvr
Дата 4.11.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(MAKCim @ 4.11.2007,  10:39)
Цитата(xvr @  4.11.2007,  10:17 Найти цитируемый пост)
а знак должен лежать ВООБЩЕ отдельно, например так:

зачем хранить знак?
Ripper
по разрядности числа лимитированы или нет?
если лимитированы (допустим, 32 разряда)
хранить нужно int
а потом в зависимости от представления, которое нужно получить, преобразовывать этот int

При внимательном изучении первого поста можно сделать выводы:
1) Разрядность лимитированна и много больше, чем 32 бита (int не подойдет)
2) Входные данные представленны в ПРЯМОМ коде (читай - с отдельным знаком), при выполнении операций нужно использовать ДОПОЛНИТЕЛЬНЫЙ код - т.е. имеет смысл данные в конструкторе конвертировать в бинарный дополнительный код и именно в таком виде и хранить (в током случае отдельный знак, как я предлагал ранее, не нужен)

PM MAIL   Вверх
Ripper
Дата 4.11.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Так. Ещё раз. 16ричное число определяется его длиной (количество цифр в числе, например, до 31) и массивом значений 16ричных цифр (типа char). Число со знаком хранится в прямом коде.

Так что хранить в моем массиве, с одной стороны это массив значений 16ричных чисел. А где хранить прямой код? Тока не говорите что числа везде одни и теже и прямой код один и тотже. Прямой код нужно в двоичном представлении хранить как я понимаю. 


и ещё вопросик
Код

static const char *HexToBin(char dig) {
    switch(dig)
    {
    case '0': return "0000";
    case '1': return "0001";
    case '2': return "0010";
    case '3': return "0011";
    case '4': return "0100";
    case '5': return "0101";
    case '6': return "0110";
    case '7': return "0111";
    case '8': return "1000";
    case '9': return "1001";
    case 'A': return "1010";
    case 'B': return "1011";
    case 'C': return "1100";
    case 'D': return "1101";
    case 'E': return "1110";
    case 'F': return "1111";
    }
    return "";
}


Как эта ф-ия работает? Извините, мне сложно на си переходить с др. языка, поэтому туго осваиваюсь. return "1111" это что, это разве указатель на тип чар? И как её потом использовать, пользователь вводит строку (массив char-ов) в виде 1FF (т.е. hex число) и мне нужно в другой массив записать это дело в 2 коде... 

Тока я так и не понял что туда писать :(


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
bsa
Дата 5.11.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Зачем тебе двоичный? У тебя в ТЗ про двоичное ничего не сказано. Храни только прямой код и знак, который будешь учитывать при арифметических операциях.
PM   Вверх
Ripper
Дата 5.11.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



И как узнать старший бит? Блин. 
В самом hex числе уже зашит знак. А как тогда производить действия в дополнительном коде? Я незнаю что такое дополнительный код в 16ричном виде. 
пользователь вводит FF+2A
1111 1111 + 00101010. Беремь инвертируем и единицу добавляем 0000 0001 11010101 и складываем. Ну что то в этом роде. Ну разве не так?
Пользователь не должен вводить "+FF" - "-FBA"




--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 6.11.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 5.11.2007,  14:02)
И как узнать старший бит? Блин. 
В самом hex числе уже зашит знак. А как тогда производить действия в дополнительном коде? 

Не надо хранить число внутри класса в hex виде - храни в бинарном. В задании сказано только про ввод/вывод числа в hex - это не значит, что и внутри должен быть hex
И старший бит тебе не нужен - арифметика (+/-) делается буз учета старшего бита.
Цитата

Я незнаю что такое дополнительный код в 16ричном виде. 
пользователь вводит FF+2A

В шестнадцатиричном просили прямой код т.е. FF+2A это сумма двух ПОЛОЖИТЕЛЬНЫХ чисел
Цитата

1111 1111 + 00101010. Беремь инвертируем и единицу добавляем 0000 0001 11010101 и складываем. Ну что то в этом роде. Ну разве не так?

Нет, просто складываем 1111 1111 + 00101010 (предполагается, что длинна чисел более 8ми битов, иначе в исходных числах ошибка - FF не представимо в виде 8ми битного числа со знаком)

Цитата

Пользователь не должен вводить "+FF" - "-FBA"

Пользователь МОЖЕТ вводить "+FF", и ДОЛЖЕН вводить "-2A"
PM MAIL   Вверх
Ripper
Дата 6.11.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



xvr, Завтра спрошу у препода. я уже незнаю чему верить
-2A - для шестнадцатеричных числе  не определно понятие отрицательное число (гдето выше писали) т.к. первый бит указывает на знак
значит ненужно вводить знак явно.



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 6.11.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 6.11.2007,  17:33)
xvr, Завтра спрошу у препода. я уже незнаю чему верить
-2A - для шестнадцатеричных числе  не определно понятие отрицательное число (гдето выше писали) т.к. первый бит указывает на знак
значит ненужно вводить знак явно.

Если мы можем написать -42, то почему бы не написать -2A ?
И первый бит указывает на знак не у шестнадцатиричных чисел, а у чисел в дополнительном коде - это абсолютно независимые понятия. С тем же успехом мы можем считать десятичные числа представленными в дополнительном коде, т.е. например  (для 8ми битных чисел) 200 будет соотвествовать -56. Требовать от внешнего представления класса, что бы hex числа для ввода/вывода были представленны в дополнительном коде (равно как и влюбом другом), это все равно, что требовать, что бы вместо числа -56 вводили 200.

PM MAIL   Вверх
powerfox
Дата 6.11.2007, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Ripper @  6.11.2007,  18:33 Найти цитируемый пост)
значит ненужно вводить знак явно.

Тебе просто советовали вводить дополнительную переменую для знака. Иначе нужно при любой операции "извлекать" знак из числа.

Добавлено через 1 минуту и 59 секунд
Цитата(xvr @  6.11.2007,  21:42 Найти цитируемый пост)
Если мы можем написать -42, то почему бы не написать -2A ?

xvr, цель 16-й чисел - облегчить работу с двоиным кодом. Кто работает с ними сразу может скачать, что в старшем бите.


--------------------
user posted image
PM WWW   Вверх
xvr
Дата 7.11.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(powerfox @ 6.11.2007,  21:06)
Цитата(xvr @  6.11.2007,  21:42 Найти цитируемый пост)
Если мы можем написать -42, то почему бы не написать -2A ?

xvr, цель 16-й чисел - облегчить работу с двоиным кодом. Кто работает с ними сразу может скачать, что в старшем бите.

Цель 16х чисел (В ДАННОМ СЛУЧАЕ) облегчить реализацию класса - многобайтовое преобразование hex<->bin делается легче, чем dec<->bin, но что то мне кажется, что об облегчения реализации, которая требовала бы ЯВНОГО кодирования отрицательных чисел в дополнительном виде речь все таки не шла smile Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1
Ы?
PM MAIL   Вверх
powerfox
Дата 7.11.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
многобайтовое преобразование hex<->bin делается легче, чем dec<->bin

Не вижу принципиальной разницы. В С++ есть средства, которые позволяю быстро преобразовать dec в hex. Это всего несколько дополнительных строк.
И в условии явно сказано, что числа хранятся в прямом коде, а в прямом знак указывается в знаковом разряде. 

Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1

Согласен. Но "ЗАДАНИЕ" есть задание. Можно просто реализовать дополнительный конструктор для чисел, записанных в форме -N.


--------------------
user posted image
PM WWW   Вверх
Ripper
Дата 7.11.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



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


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 7.11.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(powerfox @ 7.11.2007,  17:11)
Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
многобайтовое преобразование hex<->bin делается легче, чем dec<->bin

Не вижу принципиальной разницы. В С++ есть средства, которые позволяю быстро преобразовать dec в hex. Это всего несколько дополнительных строк.

И для многобайтовых (>8) чисел тоже есть? И давно?
Цитата

И в условии явно сказано, что числа хранятся в прямом коде, а в прямом знак указывается в знаковом разряде. 
Не хранятся, а ЗАДАЮТСЯ. Про формат хранения не сказано. Кроме того, знак для прямого представления может хранится где угодно - он не используется для выполнения операций (меняются сами операции, но знак в них не участвует)
Цитата

Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1

Согласен. Но "ЗАДАНИЕ" есть задание. Можно просто реализовать дополнительный конструктор для чисел, записанных в форме -N.
Собственно ЗАДАНИЕ этого не требовало smile
Да собственно сам автор уже уточнил:
Цитата

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


PM MAIL   Вверх
Ripper
Дата 7.11.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Теперь вопросы касательно самого языка. 
1)Как я всеже понял я должен перевести hex число в двоичное и записать его в массив. 
Код

_hex::_hex(char* s) {
     len=0;
     char *tmp; int x=0;
     for (; *s; s++) {
         tmp=HexToBin(*s);
         for(int j=0; j<4; j++,x++,tmp++) { 
                 number[x]=*tmp;
         }
         len++;
     }                   
     number[x]='\0'; 
      
}

Вот так коряво я это делаю, используя ф-ию:
Код

char *HexToBin(char dig) {
    switch(dig) {
     case '0': return "0000";
     case '1': return "0001";
     case '2': return "0010";
     case '3': return "0011";
     case '4': return "0100";
     case '5': return "0101";
     case '6': return "0110";
     case '7': return "0111";
     case '8': return "1000";
     case '9': return "1001";
     case 'A': return "1010";
     case 'B': return "1011";
     case 'C': return "1100";
     case 'D': return "1101";
     case 'E': return "1110";
     case 'F': return "1111";
    }
    return "";
}


Единственный вопрос почему последний элемент numer[x] а не number[x+1] = '\0'? что то я скока не считал получается вроде x+1. И может есть более прямой способ это сделать?
Теперь вопрос, а как перевести из массива чаров типа "101010101" в hex число (которое потом нужно будет вывести на экран). Т.е. мне нужно будет перегруживать куча операторов. Один из первых это "<<". Вот я что-то додуматься не могу, как бы это нормаьно сделать. 
Наверно не хватает знаний самого си. Я надеюсь я верно понимаю что в ф-ии приведенной выше return "1111" означает указатель на массив чаров 1111? на начала массива?  
По аналогии что-то не доходит как сделать. 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 7.11.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 7.11.2007,  22:38)
Теперь вопросы касательно самого языка. 
1)Как я всеже понял я должен перевести hex число в двоичное и записать его в массив. 
Код

_hex::_hex(char* s) {
     len=0;
     char *tmp; int x=0;
     for (; *s; s++) {
         tmp=HexToBin(*s);
         for(int j=0; j<4; j++,x++,tmp++) { 
                 number[x]=*tmp;
         }
         len++;
     }                   
     number[x]='\0'; 
      
}

Вот так коряво я это делаю, используя ф-ию:
Код

char *HexToBin(char dig) {
    switch(dig) {
     case '0': return "0000";
     case '1': return "0001";
     case '2': return "0010";
     case '3': return "0011";
     case '4': return "0100";
     case '5': return "0101";
     case '6': return "0110";
     case '7': return "0111";
     case '8': return "1000";
     case '9': return "1001";
     case 'A': return "1010";
     case 'B': return "1011";
     case 'C': return "1100";
     case 'D': return "1101";
     case 'E': return "1110";
     case 'F': return "1111";
    }
    return "";
}



Не надо так делать. Это САМЫЙ неудобный вид хранения числа.
Цитата

Теперь вопрос, а как перевести из массива чаров типа "101010101" в hex число (которое потом нужно будет вывести на экран). Т.е. мне нужно будет перегруживать куча операторов. Один из первых это "<<". 
Именно. И каждый оператор будет одним большим геморроем  smile 
Цитата

Единственный вопрос почему последний элемент numer[x] а не number[x+1] = '\0'? что то я скока не считал получается вроде x+1. 
Потому что в цикле for(int j=0; j<4; j++,x++,tmp++)  х будет инкрементирован после последней записи в выходной массив.
Цитата

Наверно не хватает знаний самого си. Я надеюсь я верно понимаю что в ф-ии приведенной выше return "1111" означает указатель на массив чаров 1111? на начала массива?  
Да. Получится строка с символьным битовым представлением, выполнять какие либо операции с ним крайне неудобно, хотя бы потому, что у него СТАРШИЕ разряды будут в начале массива, при этом их вес будет зависить от длинны числа, для арифметики это полный кирдык :(
Цитата

И может есть более прямой способ это сделать?
Есть. Надо использовать БИНАРНОЕ (а не текстовое) представление. Примерно так:
Код

template<int Length>
class Hex {
 int body[Length];

 void negate()
   {
     for(int i=0;i<Length;++i) body[i]=~body[i];
     *this += 1;
   }

public:

 Hex(const char* data)
  {
    bool do_invert=false;
    switch(*data)
     {
      case '+': ++data; break;
      case '-':  ++data; do_invert=true; break;
     }
   memset(body,0,sizeof(body));
   for(;*data;++data)
    {
      // Very slow, but very simple
      char s[2]={*data,0};
      *this <<= 4;
      *this += strtoul(s,0,16);
    }
   if (do_invert) negate();
  }

 Hex(int value)
  {
    body[0]=value;
    for(int i=1;i<Length;++i) body[i]=value<0?-1:0;
  }

 Hex& operator +=(const Hex&);
 Hex& operator -=(const Hex&);
 Hex& operator <<=(int);
 Hex& operator >>=(int);

 Hex operator +(const Hex& op2) {Hex rv(*this); rv+=op2; return rv;}
 Hex operator -(const Hex& op2) {Hex rv(*this); rv-=op2; return rv;}
 Hex operator <<(int op2) {Hex rv(*this); rv<<=op2; return rv;}
 Hex operator >>(int op2) {Hex rv(*this); rv>>=op2; return rv;}

 operator int() {return body[0];}
 ostream& operator<<(ostream&);
 istream& operator>>(istream&);
};
Арифметику сам напишешь smile

Это сообщение отредактировал(а) xvr - 7.11.2007, 23:23
PM MAIL   Вверх
powerfox
Дата 8.11.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(xvr @  7.11.2007,  23:26 Найти цитируемый пост)
И для многобайтовых (>8) чисел тоже есть? И давно?

sizeof(long int) smile
Я думаю, что этого вполне достаточно в большинстве случаев (32, а уж про 64 так вообще молчу).


--------------------
user posted image
PM WWW   Вверх
Ripper
Дата 8.11.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Не, мой мозг не в состоянии этого понять.
Попробую сделать хоть что-то, храня hex числа в массиве...  
:(



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 8.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(powerfox @ 8.11.2007,  18:03)
Цитата(xvr @  7.11.2007,  23:26 Найти цитируемый пост)
И для многобайтовых (>8) чисел тоже есть? И давно?

sizeof(long int) smile

sizeof(long int) это 4 (максимум 8), хотелось бы больше smile
Цитата

Я думаю, что этого вполне достаточно в большинстве случаев (32, а уж про 64 так вообще молчу).
Угу, особенно для целей криптографии, арифметики большой точности (типа вычисления числа пи с точностью 1млн знаков) и пр  smile
Сдается мне, что там, где достаточно 32 или 64 бита, классы, такие как фигурировал в задании, не применяют - там и так все просто и прозрачно, со встроенными POD типами.

Добавлено через 1 минуту и 27 секунд
Цитата(Ripper @ 8.11.2007,  18:44)
Не, мой мозг не в состоянии этого понять.
Попробую сделать хоть что-то, храня hex числа в массиве...  
:(

Для начала напиши арифметику с таким представлением, если получится, то и hex ввод/вывод получится тоже.
PM MAIL   Вверх
Ripper
Дата 8.11.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя
И я уже так запарился с этим заданием ужас)
1)template<int Length> что это?
2)что такое <<= ? в побитовых операциях ненашел такого
3)что значит прибавить к *this число? Переместить указатель на объект? что получится?
4)в задании сказано использовать массив char-ов а не int-ов
5)+ ко всему я не понял этот код т.к. незнаю вообще встроенных в си ф-ий, конечно могу посмотреть где нибудь описание, но я к другому клоню - что щас мне это совсем тяжко. Препод сказал сначала можно в hex виде хранить т.е. в массиве чаров 16ричные числа, потом сказал по другому.. Вообщем посмотрим, сделать нужно хоть как-то. Когда 16ричные числа в массиве вроде легче



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
powerfox
Дата 8.11.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя

Если вы многого не проходили, то это не значит, что это нельзя использовать. Максимальное ограничение - конкретная реализация язык (компилятор).
И то, что здесь идёт - не Си, а С++.

Мусье учится на первом курсе?


Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
1)template<int Length> что это?

Шаблон, судя по записи. Я с ними плохо знаком, но Length как-то странно здесь смотрится. Обычно указывается просто тип (int в данному случае).


Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
2)что такое <<= ? в побитовых операциях ненашел такого

<<= - это оператор. Сдвиг влево и присваивание. Принцип такой же, как и +=, который намного чаще используется.

Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
3)что значит прибавить к *this число? Переместить указатель на объект? что получится?

this - укзатель на объект, для которого вызван метод. А *this - сам объект. Обычное разыменовывание.

Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
4)в задании сказано использовать массив char-ов а не int-ов

Посмотри базовые сведения о типах в С/С++.




--------------------
user posted image
PM WWW   Вверх
xvr
Дата 8.11.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 8.11.2007,  21:13)
xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя
И я уже так запарился с этим заданием ужас)
1)template<int Length> что это?

Это шаблон, параметризованный константой (не типом). Константа задает длинну представимых чисел (в единицах по 32 бита)
Цитата

3)что значит прибавить к *this число? Переместить указатель на объект? что получится?
Это значит разыменовать this (получится экземпляр класса, а не указатель), потом к этому экземпляру применить оператор +=
Цитата

4)в задании сказано использовать массив char-ов а не int-ов
Все тоже самое можно сделать и в char'ах, ничего (кроме некоторых констант, задающих длинну элемента массива) не изменится
Цитата

Препод сказал сначала можно в hex виде хранить т.е. в массиве чаров 16ричные числа, потом сказал по другому.. Вообщем посмотрим, сделать нужно хоть как-то. Когда 16ричные числа в массиве вроде легче 
Попробуй написать арифметику с ними (+ - и изменение знака), тогда сразу поймешь, что легче smile

PM MAIL   Вверх
Ripper
Дата 8.11.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Эээх...
1)Можно без шаблонов? Ну не хочется щас читать ещё одну главу в шилде про шаблоны. наверно можно без них
2)И что значит прибавить к экземляру класса число? Этот оператор не реализован, а что он  в итоге должен делать? 
3)Я вообще не понимаю что этот код делает. 
*this += strtoul(s,0,16); 
memset(body,0,sizeof(body));
Что это за ф-ии? 
4)<<= всмысле сдвиг влево и присваивание.. например *this<<=4? 
"<<" знаю вроде, например 1010 после сдвига 0100 (влево). а какой смысле будет у *this<<=4? 

Я пробую так все это делать:
Код

const int MAX_SIZE = 31;
 
class _hex {
      private:
              int sgn;
              int len;
              char number[MAX_SIZE];
      public:
             _hex();
             _hex(char*);
             _hex(const int);
             
             friend ostream& operator<< (ostream& stream, _hex obj);
             friend istream& operator>> (istream& stream, _hex obj);
};

_hex::_hex() {
     len=0; sgn=0;
     *number='\0';
};


_hex::_hex(char* s) {
     int k;
     switch (*s) { 
            case '+': sgn=0; k=1; break;
            case '-': sgn=1; k=1; break;
            default:  sgn=0; k=0;
     }      
     for (len=0; len<MAX_SIZE&&s[len];len++) 
         number[len]=s[len+k];
     number[len]='\0'; 
      
}

Только незнаю насчет 3 конструктора и ввода >> пока ещё. 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
xvr
Дата 8.11.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Ripper @ 8.11.2007,  22:24)
Эээх...
1)Можно без шаблонов? Ну не хочется щас читать ещё одну главу в шилде про шаблоны. наверно можно без них

Можно и без шаблонов, тогда длинна числа, которое может хранить класс будет фиксированна (как у тебя и сделано)
Цитата

2)И что значит прибавить к экземляру класса число? Этот оператор не реализован, а что он  в итоге должен делать? 
Какая-нибудь арифметика для этого класса планируется или нет? Этот класс должен описывать число или просто вводить и выводить hex строку? Если это всеже класс, описывающий число, то и вести он себя должен как число. Т.е. уметь складывать себя с другим экземпляром этого же класса. Так же для класса описан конструктор из int - т.е. он будет автоматически создаваться из int при необходимости.
Код

_hex my_number("1234");

// В конструкторе _hex::_hex код
*this += i; // 'i' represents some integer value

// полностью эквивалентен
my_number+=i;

// что эквивалентно
_hex tmp(i);
my_number+=tmp;

// что эквивалентно
_hex tmp(i);
my_number.operator +=(tmp);


Цитата

3)Я вообще не понимаю что этот код делает. 
*this += strtoul(s,0,16); 
memset(body,0,sizeof(body));
Что это за ф-ии? 

strtoul(s,0,16) - преобразует строку s (которая в свою очередь состоит из одного символа из входной последовательности) в число по основанию 16 (т.е. односимвольный hex в обычное число)

*this += ... прибавляет это число к текущему значению класса.

Цитата

4)<<= всмысле сдвиг влево и присваивание.. например *this<<=4? 
"<<" знаю вроде, например 1010 после сдвига 0100 (влево). а какой смысле будет у *this<<=4? 
Эквивалентно my_number = my_number << 4, не забывай - твой класс это ЧИСЛО, и все арифметические операции с ним выполняются как с обычным ЧИСЛОМ (только очень большим)

Цитата

Код

_hex::_hex(char* s) {
     int k;
     switch (*s) { 
            case '+': sgn=0; k=1; break;
            case '-': sgn=1; k=1; break;
            default:  sgn=0; k=0;
     }      
     for (len=0; len<MAX_SIZE&&s[len];len++) 
         number[len]=s[len+k];
     number[len]='\0'; 
      
}

Эта конструкция полностью эквивалентна
Код

_hex::_hex(char* s) {
     switch (*s) { 
            case '+': sgn=0; ++s; break;
            case '-': sgn=1; ++s; break;
            default:  sgn=0;
     }
     strcpy(number,s);
     len=strlen(number);
}
Она просто копирует переданный ей параметр во внутренний буфер. Теперь объясни мне, что ты собираешься с этим буфером дальше делать? Работать с ним как с числом НЕВОЗМОЖНО.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.