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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перевод в двоичную систему, помогите найти ошибку 
:(
    Опции темы
Mikron
Дата 8.2.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 2.5.2007

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



Помогите найти ошибку
в функцию передается два массива, в одном значения пяти параметров, а во втором количество значений
допустим 
Код

parametrs[0][]={5,0,0,0,0,0,0,0,0,0}
schet_kolvo_kl[0]=2

число = parametrs[0][0]*10+parametrs[0][1]*1=50
нужно записать это число в двоичном виде в файл

Код

void zapis_v_file(int schet_kolvo_kl[], int parametrs[][10])
{
    FILE *hf_01;
    hf_01=fopen("a.txt","w");
    static int t=1;
    long znach[]={0,0,0,0,0};

    for(int k=0;k<5;k++){                                          
        for(int j=schet_kolvo_kl[k];j>0;j--){
            znach[k]+=parametrs[k][j-1]*t;
            t*=10;
        }
        t=1;
    }

    char s0[41], s1[41], s2[41], s3[41], s4[41];
    s0[40]='\0';
    s1[40]='\0';
    s2[40]='\0';
    s3[40]='\0';
    s4[40]='\0';
    for(int i=0;i<40;i++){
        s0[39-i] = ((znach[0] & (1 << i)) == 0) ? '0' : '1';             //перевод в двоичный вид
        s1[39-i] = ((znach[1] & (1 << i)) == 0) ? '0' : '1';
        s2[39-i] = ((znach[2] & (1 << i)) == 0) ? '0' : '1';
        s3[39-i] = ((znach[3] & (1 << i)) == 0) ? '0' : '1';
        s4[39-i] = ((znach[4] & (1 << i)) == 0) ? '0' : '1';
    }
    fprintf(hf_01,"%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n","0001",s0,"0010",s1,"0011",s2,"0100",s3,"0101",s4);
    fclose(hf_01);
}


пробую для 50
Код

00010011001000000000000000000000000000110010
00100000000000000000000000000000000000000000
00110000000000000000000000000000000000000000
01000000000000000000000000000000000000000000
01010000000000000000000000000000000000000000




вопрос в том, почему в первой строчке получается 00010011001000...00110010

хотя должно быть00010000000000...00110010



Это сообщение отредактировал(а) Mikron - 8.2.2010, 12:37
PM MAIL   Вверх
sQu1rr
Дата 9.2.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Если, честно мне лень читать код
Вам нужно на C или С++?
Пожалуйста опишите поподробнее что ДОЛЖНО получится... Я ничего не понимаю в условии, и уж темболее в ответе. 50 в 2чной = 110010. Что вы хотите от программы. Странный перевод в двоичную систему... Вообщем опишите все попобдробнее, тогда я постораюсь помочь.
И да...
Цитата

Помогите найти ошибку
в функцию передается два массива, в одном значения пяти параметров, а во втором количество значений
допустим 
Код

parametrs[0][]={5,0,0,0,0,0,0,0,0,0}
schet_kolvo_kl[0]=2


Вижу один двумерный массив с 10 элементами первого элемента массива и 1й элемент второго массива ( Псевдокод? массивы уже созданы? )
Вообщем напишите так чтобы было понятно

Это сообщение отредактировал(а) sQu1rr - 9.2.2010, 18:20
PM MAIL Skype GTalk   Вверх
bsa
Дата 9.2.2010, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



да тут вообще весело, товарищ даже не знает, сколько бит в лонге. В итоге использует число 40. Ладно, я бы понял, если бы было 0x40 (64)...
Короче, Mikron, ошибка в алгоритме. Исправлять нужно его. А так же необходимо пополнить знания по поводу количества разрядов в стандартных типах данных.
PM   Вверх
Mikron
Дата 11.2.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 2.5.2007

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



спасибо за помощь
Цитата(bsa @  9.2.2010,  18:50 Найти цитируемый пост)
да тут вообще весело, товарищ даже не знает, сколько бит в лонге. В итоге использует число 40. Ладно, я бы понял, если бы было 0x40 (64)...
Короче, Mikron, ошибка в алгоритме. Исправлять нужно его. А так же необходимо пополнить знания по поводу количества разрядов в стандартных типах данных. 

я использую число 40, потому что у меня максимальное возможное значение числа  znach 9999999999, то есть 5 байтов, то есть строка должна состоять из сорока битов
для такого десятизначного числа использую тип long



Цитата(sQu1rr @  9.2.2010,  18:19 Найти цитируемый пост)
Пожалуйста опишите поподробнее что ДОЛЖНО получится... Я ничего не понимаю в условии, и уж темболее в ответе. 50 в 2чной = 110010. Что вы хотите от программы. Странный перевод в двоичную систему... Вообщем опишите все попобдробнее, тогда я постораюсь помочь.

есть значение, диапазон которого от 0 до 9999999999
значение представлено в виде массива
к примеру 325 это
mass[10]={3,2,5,0,0,0,0,0,0,0}
нужно это значение записать в файл в двоичном представлении при том, что в строке должо быть 40 бит
для 325 ожидаю запись в файл
0000000000000000000000000000101000101


использую Си


Это сообщение отредактировал(а) Mikron - 11.2.2010, 16:04
PM MAIL   Вверх
bsa
Дата 11.2.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сначала приведи свой массив к типу long (сумма mass[i]*pow(10, i), где 0<=i<10 ). Затем с помощью метода сдвига маски и побитовой операции "И", переведи число в двоичную систему.
PM   Вверх
sQu1rr
Дата 11.2.2010, 18:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 13



Цитата(bsa @  11.2.2010,  16:57 Найти цитируемый пост)
Сначала приведи свой массив к типу long

В лонг не поместится больше 2^32, не вместит требуемое чило... Можно привести к __int64 например
Перевод числа в двоичную систему:
Код

// bin = char array[64+]
void DecToBin (__int64 num, char * bin)
{
   __int64 i, j;
   char tmp[64];

   for ( i=0; num; num >>= 1, i++ ) tmp[i] = (num&1)?('1'):('0');
   for ( j=0; j < i; j++ ) bin[j] = tmp[i-j-1];
}

+ добавить столько нулей сколько нужно, чтобы получилось 40 символов

Это сообщение отредактировал(а) sQu1rr - 11.2.2010, 18:11
PM MAIL Skype GTalk   Вверх
Dem_max
Дата 12.2.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

да тут вообще весело, товарищ даже не знает, сколько бит в лонге. В итоге использует число 40. 


А сколько бит в int ?

Это сообщение отредактировал(а) Dem_max - 12.2.2010, 10:28


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mrbrooks
Дата 12.2.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Mikron, может вместо того что бы писать велосипед - попробывать заюзать std::bitset?


Цитата(Dem_max @  12.2.2010,  10:28 Найти цитируемый пост)
А сколько бит в int ?

жду ответа с нетерпением.
PM MAIL   Вверх
bsa
Дата 12.2.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dem_max @  12.2.2010,  10:28 Найти цитируемый пост)
А сколько бит в int ?
sizeof(int)*8  smile 
На 16-ти разрядных машинах - 16
На 32-х и 64-х разрядных - 32.

PM   Вверх
Dem_max
Дата 12.2.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Код

На 16-ти разрядных машинах - 16
На 32-х и 64-х разрядных - 32.


На 16-ти разрядных машинах - 16
На 32-ти разрядных машинах - 32
На 64-ти разрядных машинах - 64

и вообще надо пользоваться sizeof(int)


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bsa
Дата 12.2.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
#include <iostream>

int main()
{
        std::cout << sizeof(int)*8 << std::endl;
}
Код
$ ./prog
32
$ uname -a
Linux b-s-a 2.6.31-20-generic #57-Ubuntu SMP Mon Feb 8 09:02:26 UTC 2010 x86_64 GNU/Linux
Dem_max, поэтому рекомендую проверять прежде чем писать.
Хотя не исключаю, что существуют архитектуры, где результат будет другой. Но мне они неизвестны.  smile 
PM   Вверх
Dem_max
Дата 12.2.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



вот от того что тебе не известны и нужно пользоваться sizeof


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bsa
Дата 12.2.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Dem_max, как ты мог заметить, в исходном посте я сразу использовал выражение sizeof(int)*8. И привел результаты для наиболее распространенных платформ. Не цепляйся понапрасну.


 ! 
bsa
Закончили флейм на тему размеров стандартных типов!


Это сообщение отредактировал(а) bsa - 12.2.2010, 12:46
PM   Вверх
Dem_max
Дата 12.2.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Я не цепляюсь. Я хочу сказать топикстартеру  что нужно делать правильно, а не как он.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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