Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] представление символа битами  (Прочитано 17880 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
kiv
Участник

ru
Offline Offline

« : 14-01-2009 19:00 » new

У меня такой вопрос: Как введенные симполы с клавиатуры(12шт)представить битами и записать в массив.
Записан

сам задал вопрос, сам и ответил....
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 14-01-2009 19:06 » 

kiv, Ответь для себя в начале, что есть символы с точки зрения компьютера? заодно поинтересуйся у дядюшки Гугла, что есть такое ASCII таблица. Потом уже будет легче понять, как записать в массив.
« Последнее редактирование: 14-01-2009 19:09 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
kiv
Участник

ru
Offline Offline

« Ответ #2 : 14-01-2009 19:31 » 

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

сам задал вопрос, сам и ответил....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-01-2009 19:39 » 

i-тый разряд двоичного числа (если считать самый младший нулевым) задаётся как x*(2^i), где x - собственно значение разряда: 1 или 0. Нужно всего лишь извлечь эти разряды.
Записан
kiv
Участник

ru
Offline Offline

« Ответ #4 : 14-01-2009 19:45 » 

чувствую себя тупым, можете код написать на С++ и объяснить
Записан

сам задал вопрос, сам и ответил....
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 14-01-2009 19:47 » 

Ну это уже вопрос про системы счисления.
число 123 = 1*10^2 + 2*10^1 + 3*10^0

Теперь попробуй его представить в двоичной системе по такому же принципу, только базисом будет число 2, заместо 10.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
kiv
Участник

ru
Offline Offline

« Ответ #6 : 14-01-2009 19:54 » 

эт я знаю)) в смысле как мне узнать какое число у символа по таблице(посмотреть то я могу), а программно как считать
Записан

сам задал вопрос, сам и ответил....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 14-01-2009 19:56 » 

Вот примерно так и считать Улыбаюсь Подсказка: основание счисления равно 2, и есть операции целочисленного деления и остатка от деления (в случае с двоичной системой - ещё и &1 и >> 1, но компилятор и так в общем случае оптимизирует, можно это за него не делать)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 14-01-2009 20:07 » 

kiv, Тебе приходит число, а не символ. Для компьютера абсолютно все числа. Даже таже самая программа. Просто компьютер обучили так, что при определенной последовательности чисел, делать одно, а при другой, делать совсем другое.
Код:
char ch;
cin >> ch;
В конечном счете, в переменной ch будет лежать число от 0 и до 255. Которое и будет представлять тот символ, который ввели с клавиатуры. Остается только его разложить на биты.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
kiv
Участник

ru
Offline Offline

« Ответ #9 : 14-01-2009 20:11 » 

вот теперь понятно))) попробую
Записан

сам задал вопрос, сам и ответил....
kiv
Участник

ru
Offline Offline

« Ответ #10 : 15-01-2009 15:24 » 

что я не так делаю? выводит одни нули(((
Код:
char ch;
   cin >> ch;
   int NumBin[7]={0};
    int i=7;
    while(ch>0){
  NumBin[i]=ch%2;
  ch=ch/2;
  i--;
  }
      for(i=0;i<8;i++)
   cout << NumBin[i];
Записан

сам задал вопрос, сам и ответил....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 15-01-2009 15:41 » 

Во-первых, int NumBin[8] - иначе будешь вылетать за границы массива во втором цикле (и если не повезёт - в 1м)
А какие символы вводишь? случайно не русские? так они < 0 Улыбаюсь используй не char, а unsigned char
Записан
kiv
Участник

ru
Offline Offline

« Ответ #12 : 15-01-2009 15:45 » 

да, русские)) если я сделаю  unsigned char ch; тогда все норм, верно ведь?
Записан

сам задал вопрос, сам и ответил....
kiv
Участник

ru
Offline Offline

« Ответ #13 : 15-01-2009 16:06 » 

если я делаю для ввода 12 символов, опять че-то не то выводит, или мне кажется...
Код:
unsigned char ch[13];
   cin >> ch;
 int NumBin[96]={0};
    int i=95;
   for(int j=0;j<12;j++)
   { while(ch[j]>0){
  NumBin[i]=ch[j]%2;
  ch[j]=ch[j]/2;
  i--;
  }
  }
     for(i=0;i<96;i++)
   cout << NumBin[i];

Записан

сам задал вопрос, сам и ответил....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 15-01-2009 17:27 » 

Во-первых, я не стал бы делать ввод в ch[13] из cin - может статься, пользователь введёт больше символов. Испортишь память. Если хочешь использовать статический массив из unsigned char и прочитать столько, сколько нужно, то лучше использовать метод get:
Код:
std::cin.get((char*)ch, 12);
Кстати, ch[13] - массив из 13 элементов Улыбаюсь

Второе. Когда ты делаешь в цикле
Код:
while(ch[i]>0)
у тебя не обязательно прочитаются все 8 бит. Как только закончатся ненулевые, из цикла выйдет. Например в числе 00011001 прочитает только 5 бит. i изменится соответственно.

Третье. А потом ты выводишь всё с конца (т.е., начиная с последнего числа и заканчивая 1м) - хотя, может, всё так и задумано Улыбаюсь

P.S. от себя: советую поаккуратнее форматировать код. А то пляшет по строчкам - читать трудновато.
Записан
kiv
Участник

ru
Offline Offline

« Ответ #15 : 15-01-2009 18:54 » 

Код:
while(ch[i]>0)
почему? я же здесь перевожу не двоичный кода в символ, а наоборот, т.е. число от 0 до 255 в 2ю сис сч. или дело там не так идет?
Записан

сам задал вопрос, сам и ответил....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 15-01-2009 18:57 » 

ну так, а в памяти что хранится? не двоичный код? Улыбаюсь если так понятнее будет, то: возьми символ с кодом 25. Как быстро при делении на 2 частное станет равно нулю?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines